#!/usr/bin/suidperl # # Copy file from standard input to printer device # printer device file is specified on the command line # it must match /dev/lp*, where * is a sequence of letters, digits, ., or - # it must be a character device file # it must be owned by group 'lp' use Fcntl 'O_WRONLY'; my $printer = shift; exit 1 unless defined $printer; exit 2 unless $printer =~ m{^/dev/lp[a-zA-Z.0-9-]*\z}; exit 3 unless -c $printer; my $group = getgrgid((stat _)[5]); exit 4 unless $group eq 'lp'; untaint($printer); sysopen PRINTER, $printer, O_WRONLY or exit 5; my($br, $buf); while ($br = read STDIN, $buf, 8192) { print PRINTER $buf; } exit 6 unless defined $br; close PRINTER or exit 7; exit 0; sub untaint { $_[0] =~ /(.*)/; $_[0] = $1; }