changeset 11578:b48d7fca8c73

Security fixes for fibmap_mplayer by Adam Rice <adamrice@ntlworld.com>
author attila
date Mon, 08 Dec 2003 11:21:59 +0000
parents 0645c0fc22bf
children 2f96ed23c71b
files Makefile fibmap_mplayer.c
diffstat 2 files changed, 34 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/Makefile	Mon Dec 08 11:11:32 2003 +0000
+++ b/Makefile	Mon Dec 08 11:21:59 2003 +0000
@@ -230,8 +230,8 @@
 	./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)
--- a/fibmap_mplayer.c	Mon Dec 08 11:11:32 2003 +0000
+++ b/fibmap_mplayer.c	Mon Dec 08 11:21:59 2003 +0000
@@ -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;
         }
-	close(fd);
+        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;
+        }
 	printf("%d\n",lba);
 	return 0;
 }