Consider this definition of ASM_GENERATE_INTERNAL_LABEL (from sp64-elf.h):

#undef  ASM_GENERATE_INTERNAL_LABEL
#define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM)   \
  sprintf ((LABEL), "*.L%s%ld", (PREFIX), (long)(NUM))

And a use from assemble_static_space:

   ASM_GENERATE_INTERNAL_LABEL (name, "LF", const_labelno);


For this case we can generate up to 16 bytes of data + a nul terminator.

Sadly, we only allocate 16 bytes in assemble_static_space.

Obviously it's unlikely we'll ever have a labelno that will overflow to -2147483648 without something else breaking. So in practice this isn't likely to ever cause a problem. But we still need to address it.

This causes 8 sparc configurations from config-list.mk to fail to build using the trunk compiler to build the crosses.



We can obviously fix the array to be bigger here and it's a trivial change. If we get a situation where it's out of range again, we can detect it with the existing sprintf warnings. It's also consistent in the sense that most callers to ASM_GENERATE_INTERNAL_LABEL use a significantly larger buffer than assemble_static_space.

Sadly, there's a bigger issue here. Namely that the caller and the definition of ASM_GENERATE_INTERNAL_LABEL both can include arbitrary length text into the label name. Furthermore, the buffer is allocated in the caller's context. It's a terrible API.

ISTM the way "out" is to change very ASM_GENERATE_INTERNAL_LABEL implementation to use snprintf to first determine the length of the resulting string, then allocate an appropriate amount of memory (returning it to the caller). The caller is then changed to use the buffer allocated by ASM_GENERATE_INTERNAL_LABEL, free-ing it when appropriate. Major ick. We'd probably want to hook-ize the damn thing while we're at it.

Other thoughts?

Jeff

Reply via email to