summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorattila <attila@b3059339-0415-0410-9bf9-f77b7e298cf2>2003-12-08 11:21:59 +0000
committerattila <attila@b3059339-0415-0410-9bf9-f77b7e298cf2>2003-12-08 11:21:59 +0000
commitbc0dc00da7cf99863b5581aa6dd659370a9ef6e4 (patch)
tree888a0eb5db73bca922882f3c36b66296b6f56dee
parentae1e09cbc8cc65d5c84b940b1e789757b5c97977 (diff)
downloadmpv-bc0dc00da7cf99863b5581aa6dd659370a9ef6e4.tar.bz2
mpv-bc0dc00da7cf99863b5581aa6dd659370a9ef6e4.tar.xz
Security fixes for fibmap_mplayer by Adam Rice <adamrice@ntlworld.com>
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@11579 b3059339-0415-0410-9bf9-f77b7e298cf2
-rw-r--r--Makefile4
-rw-r--r--fibmap_mplayer.c41
2 files changed, 34 insertions, 11 deletions
diff --git a/Makefile b/Makefile
index be912dd3cf..cc1bc90bcc 100644
--- a/Makefile
+++ b/Makefile
@@ -230,8 +230,8 @@ mplayer_wine.so: $(MPLAYER_DEP)
./darwinfixlib.sh $(MPLAYER_DEP)
$(CC) $(CFLAGS) -shared -Wl,-Bsymbolic -o mplayer_wine.so mplayer_wine.spec.c $(OBJS_MPLAYER) libvo/libvo.a libao2/libao2.a $(MENU_LIBS) $(VIDIX_LIBS) $(GUI_LIBS) $(COMMON_LIBS) $(GTK_LIBS) $(VO_LIBS) $(AO_LIBS) $(EXTRA_LIB) $(LIRC_LIB) $(LIRCC_LIB) $(STATIC_LIB) -lwine $(ARCH_LIB) -lm
-$(PRG_FIBMAP): fibmap_mplayer.o
- $(CC) -o $(PRG_FIBMAP) fibmap_mplayer.o
+$(PRG_FIBMAP): fibmap_mplayer.o mp_msg.o
+ $(CC) -o $(PRG_FIBMAP) fibmap_mplayer.o mp_msg.o
ifeq ($(MENCODER),yes)
$(PRG_MENCODER): $(MENCODER_DEP)
diff --git a/fibmap_mplayer.c b/fibmap_mplayer.c
index 75395a90a8..897a4d1605 100644
--- a/fibmap_mplayer.c
+++ b/fibmap_mplayer.c
@@ -11,28 +11,51 @@
#include <sys/ioctl.h>
#include <sys/stat.h>
+#include "mp_msg.h"
+
#ifndef FIBMAP
#define FIBMAP 1
#endif
int main ( int argc , char ** argv )
{
- int fd,lba=0;
- if (argc!=2) {
- fprintf(stderr,"Bad usage.\n");
+ int fd,ret,lba=0;
+ if (geteuid()!=0) {
+ mp_msg(MSGT_CPLAYER,MSGL_FATAL, "%s must be setuid root to work\n",
+ argv[0]);
+ return 1;
+ }
+ if (seteuid(getuid()) == -1) {
+ mp_msg(MSGT_CPLAYER,MSGL_FATAL, "Couldn't drop privileges: %s\n",
+ strerror(errno));
+ return 1;
+ }
+ if (argc!=2 || argv[1]==NULL) {
+ mp_msg(MSGT_CPLAYER,MSGL_FATAL,"Usage: %s <filename>\n", argv[0]);
return 1;
}
if ((fd = open(argv[1], O_RDONLY)) == -1) {
- fprintf(stderr,"Cannot open file %s: %s\n",
- argv[1] ? argv[1] : "(NULL)", strerror(errno));
+ mp_msg(MSGT_CPLAYER,MSGL_FATAL,"Cannot open file %s: %s\n",
+ argv[1], strerror(errno));
return 1;
}
- if (ioctl(fd, FIBMAP, &lba) != 0) {
- fprintf(stderr,"fibmap ioctl: %s (Hint: %s is not suid root?)\n",strerror(errno),argv[0]);
- close(fd);
+ if (seteuid(0) == -1) {
+ mp_msg(MSGT_CPLAYER,MSGL_FATAL, "Couldn't restore root privileges: %s\n",
+ strerror(errno));
+ return 1;
+ }
+ ret = ioctl(fd, FIBMAP, &lba);
+ if (seteuid(getuid()) == -1) {
+ mp_msg(MSGT_CPLAYER,MSGL_FATAL, "Couldn't re-drop privileges: %s\n",
+ strerror(errno));
+ return 1;
+ }
+ close(fd);
+ if (ret != 0) {
+ mp_msg(MSGT_CPLAYER,MSGL_FATAL,"fibmap ioctl failed: %s\n",
+ strerror(errno));
return 1;
}
- close(fd);
printf("%d\n",lba);
return 0;
}