2012-09-20 27 views
2

我正在使用C處理CGI文件,該處理器只在請求方法爲POST時才執行操作。Howto get_env(REQUEST_METHOD)w/o錯誤500

int main(void) 
{ 
    char *method_str = getenv("REQUEST_METHOD"); 
    int iMethod = strcmp(method_str,"POST"); 
    int tid = 0; 
    int own_id = 0; 
    char key[16] = "\0"; 


    if (iMethod == -1) { 
     puts("Location:start.cgi\n\n"); 
    } else if (iMethod == 0) { 
     char *data = getenv("CONTENT_LENGTH"); 
     int size = atoi(data); 
     char *buffer = malloc((size+1)*sizeof(char)); 
     fgets(buffer,atoi(data)+1,stdin); 
     int counter = count(buffer); 
     char **names = malloc(counter*sizeof(char *)); 
     char **values = malloc(counter*sizeof(char *)); 
     parse(buffer, names, values); 
     int isDel = strcmp(*(values+1),"Back to Start"); 
     if (isDel == 0) startpage(atoi(*values)); 
     else { 
      own_id = atoi(*values); 
      sprintf(key,"%s",*(values+1)); 
      int stat = login_status(own_id,key); 
      if (stat == -1) { 
       startpage(0); 
      } else userpage(own_id); 
     } 
     free_mallocs(names,values,counter); 
     free(buffer); 

    } 
    free(method_str); 

    return 0; 
} 

運行在gdb的CGI文件告訴我,這個問題是在該行:

int iMethod = strcmp(method_str,"POST");。錯誤是SIGSEGV。

當我從XAMPP服務器打開它時,CGI運行良好。但是,當我在與我不同的Ubuntu服務器上運行它時,會發生錯誤500。我嘗試將getenv("REQUEST_METHOD")的值與NULL進行比較,並且gdb告訴我文件正常運行。但是,CGI文件無法在我的XAMPP服務器和其他服務器上正常運行,其中兩個顯示錯誤500. 我可以告訴你的是這些函數的內容頭設置。 count()和parse()函數的設置是恰當的,與當前的情況無關。 在此先感謝。

更新:如果用戶直接打開CGI文件,瀏覽器將重定向到另一個CGI文件。

回答

0

strcmp當第一個參數是NULL時會發生段錯誤。檢查NULL,你會被罰款:

char *method_str = getenv("REQUEST_METHOD"); 
int iMethod = -1; 
if (method_str != NULL) 
    iMethod = strcmp(method_str,"POST"); 
} 

作爲一個額外的,儘量避免strcmp並始終使用strncmp,因爲它是更安全:

strncmp(method_str, "POST", 4); 
+0

它現在可以工作。非常感謝你。我會記住這一點。 –

1

我不確定什麼究竟你如果環境變量不存在,則詢問但getenv()返回NULL。解引用NULL指針是未定義的行爲,傳遞給strcmp()的指針將被解除引用。將NULL作爲參數傳遞給strcmp()是因此未定義的行爲,可能是分段錯誤(並且可能是此處的原因)。用method_str上的NULL檢查保護對strcmp()的呼叫。

爲什麼環境變量不存在我不知道。

+0

當我在gdb上運行文件時,我也注意到'getenv()'的NULL值。之所以使用'strcmp()'是因爲當我在XAMPP服務器上運行腳本時,'getenv(「REQUEST_METHOD」)'的默認值是「GET」。我也不知道爲什麼env變量不存在。接下來我做的是刪除指向char的指針,將'getenv(「REQUEST_METHOD」)'直接與字符串「POST」進行比較,並分析返回值。仍然有錯誤500.我會嘗試修復代碼。 –

+0

感謝您的提示。 –