ソースを参照

modules/carrierroute fixed permission checking in mod_init

Check the permission of the cfg file based on the user settings passed to the daemon, it it applies
Marius Zbihlei 14 年 前
コミット
78f3ede8c8
1 ファイル変更16 行追加2 行削除
  1. 16 2
      modules/carrierroute/carrierroute.c

+ 16 - 2
modules/carrierroute/carrierroute.c

@@ -40,6 +40,7 @@
 #include "../../sr_module.h"
 #include "../../sr_module.h"
 #include "../../str.h"
 #include "../../str.h"
 #include "../../mem/mem.h"
 #include "../../mem/mem.h"
+#include "../../ut.h" /* for user2uid() */
 #include "carrierroute.h"
 #include "carrierroute.h"
 #include "cr_fixup.h"
 #include "cr_fixup.h"
 #include "cr_map.h"
 #include "cr_map.h"
@@ -154,6 +155,8 @@ struct module_exports exports = {
  */
  */
 static int mod_init(void) {
 static int mod_init(void) {
 	struct stat fs;
 	struct stat fs;
+	extern char* user; /*from main.c*/
+	int uid, gid;
 
 
 	if(register_mi_mod(exports.name, mi_cmds)!=0)
 	if(register_mi_mod(exports.name, mi_cmds)!=0)
 	{
 	{
@@ -197,9 +200,20 @@ static int mod_init(void) {
 		if(fs.st_mode & S_IWOTH){
 		if(fs.st_mode & S_IWOTH){
 			LM_WARN("insecure file permissions, routing data is world writeable\n");
 			LM_WARN("insecure file permissions, routing data is world writeable\n");
 		}
 		}
+
+		if (user){
+			if (user2uid(&uid, &gid, user)<0){
+				LM_ERR("bad user name/uid number: -u %s\n", user);
+				return -1;
+			}
+		} else {
+			uid = geteuid();
+			gid = getegid();
+		}
+
 		if( !( fs.st_mode & S_IWOTH) &&
 		if( !( fs.st_mode & S_IWOTH) &&
-			!((fs.st_mode & S_IWGRP) && (fs.st_gid == getegid())) &&
-			!((fs.st_mode & S_IWUSR) && (fs.st_uid == geteuid())) ) {
+			!((fs.st_mode & S_IWGRP) && (fs.st_gid == uid)) &&
+			!((fs.st_mode & S_IWUSR) && (fs.st_uid == gid))) {
 				LM_ERR("config file %s not writable\n", config_file);
 				LM_ERR("config file %s not writable\n", config_file);
 				return -1;
 				return -1;
 		}
 		}