- if (len > size)
- len = size - 1;
- memcpy(buffer, s->s_proto, len);
- buffer[len] = '\0';
- s->s_proto = buffer;
- buffer += len + 1;
- size -= len + 1;
- for (char **q = s->s_aliases; size > 0 && *q != 0; q++){
- len = strlen(*q);
- if (len > size)
- len = size - 1;
- memcpy(buffer, *q, len);
- buffer[len] = '\0';
- *q = buffer;
- buffer += len + 1;
- size -= len + 1;
+ if (pos + len >= size)
+ {
+ return NULL;
+ }
+ memcpy(buffer + pos, s->s_proto, len);
+ buffer[pos + len] = '\0';
+ s->s_proto = buffer + pos;
+
+ /* track position in the buffer */
+ pos += len + 1;
+
+ /* ensure pointer alignment */
+ unsigned int misalign = sizeof(char *) - pos%sizeof(char *);
+ if(misalign < sizeof(char *))
+ pos += misalign;
+
+ /* leave space for pointer list */
+ char **p = s->s_aliases, **q;
+ char **s_aliases = (char **)(buffer + pos);
+ while(*(p++) != 0)
+ pos += sizeof(char *);
+
+ /* copy addresses and fill new pointer list */
+ for (p = s->s_aliases, q = s_aliases; *p != 0; p++, q++){
+ len = strlen(*p);
+ if (size <= pos + len)
+ {
+ return NULL;
+ }
+ memcpy(buffer + pos, *p, len); /* copy content */
+ buffer[pos + len] = '\0';
+ *q = buffer + pos; /* set copied pointer to copied content */
+ pos += len + 1;