Fix buggy kmem_{v}asprintf() functions
When the kvasprintf() call fails they should reset the arguments by calling va_start()/va_copy() and va_end() inside the loop, otherwise they'll try to read more arguments rather than starting over and reading them from the beginning. Signed-off-by: Ricardo M. Correia <ricardo.correia@oracle.com> Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
This commit is contained in:
parent
9dd5d138b2
commit
2c762de830
|
@ -245,11 +245,11 @@ kmem_vasprintf(const char *fmt, va_list ap)
|
||||||
va_list aq;
|
va_list aq;
|
||||||
char *ptr;
|
char *ptr;
|
||||||
|
|
||||||
va_copy(aq, ap);
|
|
||||||
do {
|
do {
|
||||||
|
va_copy(aq, ap);
|
||||||
ptr = kvasprintf(GFP_KERNEL, fmt, aq);
|
ptr = kvasprintf(GFP_KERNEL, fmt, aq);
|
||||||
|
va_end(aq);
|
||||||
} while (ptr == NULL);
|
} while (ptr == NULL);
|
||||||
va_end(aq);
|
|
||||||
|
|
||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
|
@ -261,11 +261,11 @@ kmem_asprintf(const char *fmt, ...)
|
||||||
va_list ap;
|
va_list ap;
|
||||||
char *ptr;
|
char *ptr;
|
||||||
|
|
||||||
va_start(ap, fmt);
|
|
||||||
do {
|
do {
|
||||||
|
va_start(ap, fmt);
|
||||||
ptr = kvasprintf(GFP_KERNEL, fmt, ap);
|
ptr = kvasprintf(GFP_KERNEL, fmt, ap);
|
||||||
|
va_end(ap);
|
||||||
} while (ptr == NULL);
|
} while (ptr == NULL);
|
||||||
va_end(ap);
|
|
||||||
|
|
||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue