}
int loop_write(int fd, const void *buf, size_t nbytes, bool do_poll) {
- const uint8_t *p = ASSERT_PTR(buf);
+ const uint8_t *p;
assert(fd >= 0);
- if (_unlikely_(nbytes > (size_t) SSIZE_MAX))
- return -EINVAL;
+ if (nbytes == 0) {
+ static const dummy_t dummy[0];
+ assert_cc(sizeof(dummy) == 0);
+ p = (const void*) dummy; /* Some valid pointer, in case NULL was specified */
+ } else {
+ assert(buf);
+
+ if (nbytes == SIZE_MAX)
+ nbytes = strlen(buf);
+ else if (_unlikely_(nbytes > (size_t) SSIZE_MAX))
+ return -EINVAL;
+
+ p = buf;
+ }
do {
ssize_t k;
use_color = colors_enabled();
if (use_color)
- (void) loop_write(ttyfd, ANSI_HIGHLIGHT, STRLEN(ANSI_HIGHLIGHT), false);
+ (void) loop_write(ttyfd, ANSI_HIGHLIGHT, SIZE_MAX, false);
- (void) loop_write(ttyfd, message, strlen(message), false);
+ (void) loop_write(ttyfd, message, SIZE_MAX, false);
(void) loop_write(ttyfd, " ", 1, false);
if (!FLAGS_SET(flags, ASK_PASSWORD_SILENT) && !FLAGS_SET(flags, ASK_PASSWORD_ECHO)) {
if (use_color)
- (void) loop_write(ttyfd, ansi_grey(), strlen(ansi_grey()), false);
- (void) loop_write(ttyfd, PRESS_TAB, strlen(PRESS_TAB), false);
+ (void) loop_write(ttyfd, ansi_grey(), SIZE_MAX, false);
+ (void) loop_write(ttyfd, PRESS_TAB, SIZE_MAX, false);
press_tab_visible = true;
}
if (use_color)
- (void) loop_write(ttyfd, ANSI_NORMAL, STRLEN(ANSI_NORMAL), false);
+ (void) loop_write(ttyfd, ANSI_NORMAL, SIZE_MAX, false);
new_termios = old_termios;
new_termios.c_lflag &= ~(ICANON|ECHO);
if (c == 4) { /* C-d also known as EOT */
if (ttyfd >= 0)
- (void) loop_write(ttyfd, SKIPPED, strlen(SKIPPED), false);
+ (void) loop_write(ttyfd, SKIPPED, SIZE_MAX, false);
goto skipped;
}
* first key (and only as first key), or ... */
if (ttyfd >= 0)
- (void) loop_write(ttyfd, NO_ECHO, strlen(NO_ECHO), false);
+ (void) loop_write(ttyfd, NO_ECHO, SIZE_MAX, false);
} else if (ttyfd >= 0)
(void) loop_write(ttyfd, "\a", 1, false);
/* ... or by pressing TAB at any time. */
if (ttyfd >= 0)
- (void) loop_write(ttyfd, NO_ECHO, strlen(NO_ECHO), false);
+ (void) loop_write(ttyfd, NO_ECHO, SIZE_MAX, false);
} else if (p >= sizeof(passphrase)-1) {