ASoC: Simplify format_register_str() without stack usages
authorTakashi Iwai <tiwai@suse.de>
Tue, 26 May 2015 12:40:14 +0000 (14:40 +0200)
committerMark Brown <broonie@kernel.org>
Tue, 26 May 2015 15:21:57 +0000 (16:21 +0100)
Instead of allocating two string buffers on stack and copying them
back, manipulate directly the target string buffer.  This simplifies
the code well.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/soc-core.c

index 7d028e8a7f1d02320ffa04fedbe478e72c14e028..95414a2cec1b6683b2f99c66deeb961e3b6cbe2a 100644 (file)
@@ -92,30 +92,21 @@ static int format_register_str(struct snd_soc_codec *codec,
        int wordsize = min_bytes_needed(codec->driver->reg_cache_size) * 2;
        int regsize = codec->driver->reg_word_size * 2;
        int ret;
-       char tmpbuf[len + 1];
-       char regbuf[regsize + 1];
-
-       /* since tmpbuf is allocated on the stack, warn the callers if they
-        * try to abuse this function */
-       WARN_ON(len > 63);
 
        /* +2 for ': ' and + 1 for '\n' */
        if (wordsize + regsize + 2 + 1 != len)
                return -EINVAL;
 
-       ret = snd_soc_read(codec, reg);
-       if (ret < 0) {
-               memset(regbuf, 'X', regsize);
-               regbuf[regsize] = '\0';
-       } else {
-               snprintf(regbuf, regsize + 1, "%.*x", regsize, ret);
-       }
-
-       /* prepare the buffer */
-       snprintf(tmpbuf, len + 1, "%.*x: %s\n", wordsize, reg, regbuf);
-       /* copy it back to the caller without the '\0' */
-       memcpy(buf, tmpbuf, len);
+       sprintf(buf, "%.*x: ", wordsize, reg);
+       buf += wordsize + 2;
 
+       ret = snd_soc_read(codec, reg);
+       if (ret < 0)
+               memset(buf, 'X', regsize);
+       else
+               sprintf(buf, "%.*x", regsize, ret);
+       buf[regsize] = '\n';
+       /* no NUL-termination needed */
        return 0;
 }