diff options
| -rw-r--r-- | Documentation/s390/s390dbf.txt | 7 | ||||
| -rw-r--r-- | arch/s390/include/asm/debug.h | 9 |
2 files changed, 15 insertions, 1 deletions
diff --git a/Documentation/s390/s390dbf.txt b/Documentation/s390/s390dbf.txt index 2d10053dd97e..ae66f9b90a25 100644 --- a/Documentation/s390/s390dbf.txt +++ b/Documentation/s390/s390dbf.txt | |||
| @@ -495,6 +495,13 @@ and for each vararg a long value. So e.g. for a debug entry with a format | |||
| 495 | string plus two varargs one would need to allocate a (3 * sizeof(long)) | 495 | string plus two varargs one would need to allocate a (3 * sizeof(long)) |
| 496 | byte data area in the debug_register() function. | 496 | byte data area in the debug_register() function. |
| 497 | 497 | ||
| 498 | IMPORTANT: Using "%s" in sprintf event functions is dangerous. You can only | ||
| 499 | use "%s" in the sprintf event functions, if the memory for the passed string is | ||
| 500 | available as long as the debug feature exists. The reason behind this is that | ||
| 501 | due to performance considerations only a pointer to the string is stored in | ||
| 502 | the debug feature. If you log a string that is freed afterwards, you will get | ||
| 503 | an OOPS when inspecting the debug feature, because then the debug feature will | ||
| 504 | access the already freed memory. | ||
| 498 | 505 | ||
| 499 | NOTE: If using the sprintf view do NOT use other event/exception functions | 506 | NOTE: If using the sprintf view do NOT use other event/exception functions |
| 500 | than the sprintf-event and -exception functions. | 507 | than the sprintf-event and -exception functions. |
diff --git a/arch/s390/include/asm/debug.h b/arch/s390/include/asm/debug.h index 31ed5686a968..18124b75a7ab 100644 --- a/arch/s390/include/asm/debug.h +++ b/arch/s390/include/asm/debug.h | |||
| @@ -167,6 +167,10 @@ debug_text_event(debug_info_t* id, int level, const char* txt) | |||
| 167 | return debug_event_common(id,level,txt,strlen(txt)); | 167 | return debug_event_common(id,level,txt,strlen(txt)); |
| 168 | } | 168 | } |
| 169 | 169 | ||
| 170 | /* | ||
| 171 | * IMPORTANT: Use "%s" in sprintf format strings with care! Only pointers are | ||
| 172 | * stored in the s390dbf. See Documentation/s390/s390dbf.txt for more details! | ||
| 173 | */ | ||
| 170 | extern debug_entry_t * | 174 | extern debug_entry_t * |
| 171 | debug_sprintf_event(debug_info_t* id,int level,char *string,...) | 175 | debug_sprintf_event(debug_info_t* id,int level,char *string,...) |
| 172 | __attribute__ ((format(printf, 3, 4))); | 176 | __attribute__ ((format(printf, 3, 4))); |
| @@ -206,7 +210,10 @@ debug_text_exception(debug_info_t* id, int level, const char* txt) | |||
| 206 | return debug_exception_common(id,level,txt,strlen(txt)); | 210 | return debug_exception_common(id,level,txt,strlen(txt)); |
| 207 | } | 211 | } |
| 208 | 212 | ||
| 209 | 213 | /* | |
| 214 | * IMPORTANT: Use "%s" in sprintf format strings with care! Only pointers are | ||
| 215 | * stored in the s390dbf. See Documentation/s390/s390dbf.txt for more details! | ||
| 216 | */ | ||
| 210 | extern debug_entry_t * | 217 | extern debug_entry_t * |
| 211 | debug_sprintf_exception(debug_info_t* id,int level,char *string,...) | 218 | debug_sprintf_exception(debug_info_t* id,int level,char *string,...) |
| 212 | __attribute__ ((format(printf, 3, 4))); | 219 | __attribute__ ((format(printf, 3, 4))); |
