axfer: check whether a terminal is referred for stdio

A reference to a terminal for standard input/output brings some
troubles. For capture transmission, it can bring some terminal
control codes and it's possible to make the terminal in disorder.
For playback transmission, it can bring endless loop to read
data for detection of type of container.

This commit checks whether a terminal is referred for the standard
input/output by a call isatty(3). When detecting a terminal,
axfer run time prints message and goes to finish.

Suggested-by: Takashi Iwai <tiwai@suse.com>
Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
Takashi Sakamoto 2018-12-05 10:25:04 +09:00 committed by Takashi Iwai
parent b8833717bb
commit bae5761d72

View file

@ -168,6 +168,13 @@ int container_parser_init(struct container_context *cntr,
// Open a target descriptor. // Open a target descriptor.
if (!strcmp(path, "-")) { if (!strcmp(path, "-")) {
cntr->fd = fileno(stdin); cntr->fd = fileno(stdin);
if (isatty(cntr->fd)) {
fprintf(stderr,
"A terminal is referred for standard input. "
"Output from any process or shell redirection "
"should be referred instead.\n");
return -EIO;
}
err = set_nonblock_flag(cntr->fd); err = set_nonblock_flag(cntr->fd);
if (err < 0) if (err < 0)
return err; return err;
@ -245,6 +252,13 @@ int container_builder_init(struct container_context *cntr,
return -EINVAL; return -EINVAL;
if (!strcmp(path, "-")) { if (!strcmp(path, "-")) {
cntr->fd = fileno(stdout); cntr->fd = fileno(stdout);
if (isatty(cntr->fd)) {
fprintf(stderr,
"A terminal is referred for standard output. "
"Input to any process or shell redirection "
"should be referred instead.\n");
return -EIO;
}
err = set_nonblock_flag(cntr->fd); err = set_nonblock_flag(cntr->fd);
if (err < 0) if (err < 0)
return err; return err;