END_TEST void *add_and_lookup_stuff(void *parm) { int i = 0; while((i < 1000) || (everybody_started == false)) { struct addrinfo *pAddr = (struct addrinfo *)calloc(1,sizeof(addrinfo)); struct sockaddr_in *pINetAddr; const char *word = getRandomWord((unsigned int *)parm); i++; if(NULL == get_cached_addrinfo(word)) { pAddr->ai_addr = (struct sockaddr *)calloc(1,sizeof(struct sockaddr_in)); pAddr->ai_family = AF_INET; pINetAddr = (struct sockaddr_in *)pAddr->ai_addr; pAddr->ai_canonname = strdup(word); pINetAddr->sin_addr.s_addr = rand_r((unsigned int *)parm); pAddr = insert_addr_name_info(pAddr,pAddr->ai_canonname); } else { freeaddrinfo(pAddr); pAddr = get_cached_addrinfo_full(word); } fail_unless((pAddr != NULL)); if(pAddr != NULL) { char *p1; char *p2; struct sockaddr_in *p3; struct addrinfo *p4; pINetAddr = (struct sockaddr_in *)pAddr->ai_addr; p1 = get_cached_nameinfo(pINetAddr); p2 = get_cached_fullhostname(word,pINetAddr); p3 = get_cached_addrinfo(word); p4 = get_cached_addrinfo_full(word); fail_unless(((p1 != NULL)&&(p2 != NULL)&&(p3 != NULL)&&(p4 != NULL))); } else { } } return NULL; }
int svr_get_privilege( char *user, /* I */ char *host) /* I */ { int is_root = 0; int priv = (ATR_DFLAG_USRD | ATR_DFLAG_USWR); int num_host_chars; char uh[PBS_MAXUSER + PBS_MAXHOSTNAME + 2]; char host_no_port[PBS_MAXHOSTNAME+1]; char *colon_loc = NULL; char log_buf[LOCAL_LOG_BUF_SIZE]; char *other_host; int other_priv = 0; int my_err; pbs_net_t server_addr; pbs_net_t connect_addr; #ifndef __CYGWIN__ pbs_net_t local_server_addr; #endif if (!user) { sprintf(log_buf, "Invalid user: %s", "null"); log_record(PBSEVENT_SECURITY, PBS_EVENTCLASS_SERVER, __func__, log_buf); return(0); } /* user name cannot be longer than PBS_MAXUSER*/ if (strlen(user) > PBS_MAXUSER) { sprintf(log_buf, "Invalid user: %s", user); log_record(PBSEVENT_SECURITY, PBS_EVENTCLASS_SERVER, __func__, log_buf); return(0); } if (!host) return(0); colon_loc = strchr(host, ':'); /* if the request host has port information in it, we want to strip it out */ if (colon_loc == NULL) { /* no colon found */ num_host_chars = strlen(host); sprintf(host_no_port, "%s", host); } else { num_host_chars = colon_loc - host; /* actually remove the colon for host_no_port */ *colon_loc = '\0'; sprintf(host_no_port,"%s",host); *colon_loc = ':'; } /* num_host_chars cannot be more than PBS_MAXHOSTNAME */ if (num_host_chars > PBS_MAXHOSTNAME) { snprintf(log_buf, sizeof(log_buf), "Invalid host: %s", host); log_record(PBSEVENT_SECURITY, PBS_EVENTCLASS_SERVER, __func__, log_buf); return(0); } sprintf(uh, "%s@%s", user, host); server_addr = get_hostaddr(&my_err, server_host); connect_addr = get_hostaddr(&my_err, host_no_port); #ifdef __CYGWIN__ if ((IamAdminByName(user)) && (server_addr == connect_addr)) { return(priv | ATR_DFLAG_MGRD | ATR_DFLAG_MGWR | ATR_DFLAG_OPRD | ATR_DFLAG_OPWR); } #else /* __CYGWIN__ */ local_server_addr = get_hostaddr(&my_err, server_localhost); if ((strcmp(user, PBS_DEFAULT_ADMIN) == 0) && ((connect_addr == server_addr) || (connect_addr == local_server_addr))) { is_root = 1; #ifdef PBS_ROOT_ALWAYS_ADMIN if (is_root) { /* This statement allows us to compile with gcc-warnings */ /* if PBS_ROOT_ALWAYS_ADMIN is true is_root is assigned but never used */ ; } return(priv | ATR_DFLAG_MGRD | ATR_DFLAG_MGWR | ATR_DFLAG_OPRD | ATR_DFLAG_OPWR); #endif } #endif /* __CYGWIN__ */ pthread_mutex_lock(server.sv_attr_mutex); if (!(server.sv_attr[SRV_ATR_managers].at_flags & ATR_VFLAG_SET)) { #ifndef PBS_ROOT_ALWAYS_ADMIN if (is_root) priv |= (ATR_DFLAG_MGRD | ATR_DFLAG_MGWR); #endif } else if (acl_check(&server.sv_attr[SRV_ATR_managers], uh, ACL_User)) { priv |= (ATR_DFLAG_MGRD | ATR_DFLAG_MGWR); } if (!(server.sv_attr[SRV_ATR_operators].at_flags & ATR_VFLAG_SET)) { #ifndef PBS_ROOT_ALWAYS_ADMIN if (is_root) priv |= (ATR_DFLAG_OPRD | ATR_DFLAG_OPWR); #endif } else if (acl_check(&server.sv_attr[SRV_ATR_operators], uh, ACL_User)) { priv |= (ATR_DFLAG_OPRD | ATR_DFLAG_OPWR); } pthread_mutex_unlock(server.sv_attr_mutex); /* resolve using the other hostname (if available) and give the higher privilege */ other_host = get_cached_fullhostname(host, NULL); if ((other_host != NULL) && (strcmp(host, other_host))) other_priv = svr_get_privilege(user, other_host); if (other_priv > priv) priv = other_priv; return(priv); } /* END svr_get_privilege() */