- if (opt == L('?') || opt == L('@')) \
- newp = alloca (offsetof (struct patternlist, str) \
- + (pattern_len * sizeof (CHAR))); \
- else \
- newp = alloca (offsetof (struct patternlist, str) \
- + ((p - startp + 1) * sizeof (CHAR))); \
+ plen = (opt == L('?') || opt == L('@') \
+ ? pattern_len \
+ : p - startp + 1); \
+ plensize = plen * sizeof (CHAR); \
+ newpsize = offsetof (struct patternlist, str) + plensize; \
+ if ((size_t) -1 / sizeof (CHAR) < plen \
+ || newpsize < offsetof (struct patternlist, str) \
+ || ALLOCA_LIMIT <= newpsize) \
+ return -1; \
+ newp = (struct patternlist *) alloca (newpsize); \