[llvmlinux] VLAIS cleanup

Renato Golin renato.golin at linaro.org
Mon Mar 24 15:45:39 UTC 2014


Folks,

I'm having a look on how to clean up the VLAIS issue in the list of
patches below:

http://git.linuxfoundation.org/?p=llvmlinux.git;a=tree;f=arch/all/patches;h=ba70efe3443edcb237dafdfedd4c9904f8ed6b4b;hb=HEAD

As far as I could tell, they're *all* related to the same pattern:

function_whatever(arguments) {
  struct {
    struct shash_desc desc;
    char ctx[crypto_shash_descsize(lmk->hash_tfm)];
  } sdesc;
  ...
  // sometimes...
  ctx = ...;

  // always
  whatever = another_function(&sdesc.desc, ...);

  // sometimes, less often
  return ctx;
}

I'm not a kernel expert, but I couldn't find any of those functions
receiving the address of the first member modifying anything past the
sizeof(desc), which is the only way it could be using the ctx member
without clearly stated in the code.

Assuming none of the functions receiving a member's address will write
past it (and use the next member's memory), there are three
situations:

1. The VLAIS use is dead code.

ctx is never used (nor passed forward) in that function, and being a
local type, it can be removed, and probably is, by the compiler.

In those cases, the patch should be to just remove the VLAIS usage,
coalesce the outer struct into the inner struct, struct shash_desc
desc;

The files that fall into those cases are:
 * drivers/md/dm-crypt.c
 * crypto/hmac.c
 * net/mac80211/aes_ccm.c

2. The VLA can easily be separated from the structure.

Same example as above, but separated use of the context. In that case,
just split the structure and use the desc and the context by
themselves.

Files in this category are:
 * lib/libcrc32c.c
 * crypto/testmgr.c

3. The VLA is an integral part of the structure.

In this case, we'll need some patch to re-encode the structure in a
dynamic way. Marc's idea to use headers isn't too far off from the
ugliness already present in the files, especially on a file that has
already a comment "Today's hack".

Files in this category:
 * net/netfilter/xt_repldata.h

Am I missing something?

cheers,
--renato


More information about the LLVMLinux mailing list