- memcpy(packet->auth, buf, 16);
- /* TODO: copy attributes starting at buf[16]. */
- return packet;
+
+ i = 16;
+ while (i + 2 < buflen) {
+ atype = buf[i++];
+ alen = buf[i++];
+ if (alen < 2) {
+#if DEBUG
+ fprintf(stderr,
+ "%s: DEBUG: attribute (type %d, len %d) has an invalid length\n",
+ __func__, atype, alen);
+#endif
+ errno = EPROTO;
+ rs_packet_free(ctx, &p);
+ return NULL;
+ }
+ alen -= 2;
+ if (alen + i >= buflen) {
+#if DEBUG
+ fprintf(stderr,
+ "%s: DEBUG: attribute (type %d, len %d) wouldn't fit packet\n",
+ __func__, atype, alen);
+#endif
+ errno = EPROTO;
+ rs_packet_free(ctx, &p);
+ return NULL;
+ }
+ tlv = maketlv(atype, alen, (void *) (buf + i));
+ if (tlv)
+ _list_push(ctx, p->attrs, tlv);
+ else {
+ errno = ENOMEM;
+ rs_packet_free(ctx, &p);
+ }
+ i += alen;
+ }
+ memcpy(p->auth, buf, 16);
+ return p;