text: /* TEMPLATE GENERATED TESTCASE FILE
  Filename: CWE134_Uncontrolled_Format_String__char_connect_socket_vprintf_61b.c
  Label Definition File: CWE134_Uncontrolled_Format_String.vasinks.label.xml
  Template File: sources-vasinks-61b.tmpl.c
  */
  /*
   * @description
   * CWE: 134 Uncontrolled Format String
   * BadSource: connect_socket Read data using a connect socket (client side)
   * GoodSource: Copy a fixed string into data
   * Sinks: vprintf
   *    GoodSink: vprintf with a format string
   *    BadSink : vprintf without a format string
   * Flow Variant: 61 Data flow: data returned from one function to another in different source files
   *
   * */
  
  #include <stdarg.h>
  #include "std_testcase.h"
  
  #ifdef _WIN32
  # include <winsock2.h>
  # include <windows.h>
  # include <direct.h>
  # pragma comment(lib, "ws2_32") /* include ws2_32.lib when linking */
  # define CLOSE_SOCKET closesocket
  # define PATH_SZ 100
  #else /* NOT _WIN32 */
  # define INVALID_SOCKET -1
  # define SOCKET_ERROR -1
  # define CLOSE_SOCKET close
  # define SOCKET int
  # define PATH_SZ PATH_MAX
  #endif
  
  #define TCP_PORT 27015
  
  #ifndef OMITBAD
  
  char * CWE134_Uncontrolled_Format_String__char_connect_socket_vprintf_61b_bad_source(char * data)
  {
      {
  #ifdef _WIN32
          WSADATA wsa_data;
          int wsa_data_init = 0;
  #endif
          int recv_rv;
          struct sockaddr_in s_in;
          char *replace;
          SOCKET connect_socket = INVALID_SOCKET;
          size_t data_len = strlen(data);
          do
          {
  #ifdef _WIN32
              if (WSAStartup(MAKEWORD(2,2), &wsa_data) != NO_ERROR) break;
              wsa_data_init = 1;
  #endif
              connect_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
              if (connect_socket == INVALID_SOCKET) break;
              memset(&s_in, 0, sizeof(s_in));
              s_in.sin_family = AF_INET;
              s_in.sin_addr.s_addr = inet_addr("127.0.0.1");
              s_in.sin_port = htons(TCP_PORT);
              if (connect(connect_socket, (struct sockaddr*)&s_in, sizeof(s_in)) == SOCKET_ERROR) break;
              /* Abort on error or the connection was closed, make sure to recv one
               * less char than is in the recv_buf in order to append a terminator */
              recv_rv = recv(connect_socket, (char *)data+data_len, (int)(100-data_len-1), 0);
              if (recv_rv == SOCKET_ERROR || recv_rv == 0) break;
              /* Append null terminator */
              data[recv_rv] = '\0';
              /* Eliminate CRLF */
              replace = strchr(data, '\r');
              if (replace) *replace = '\0';
              replace = strchr(data, '\n');
              if (replace) *replace = '\0';
          }
          while (0);
          if (connect_socket != INVALID_SOCKET) CLOSE_SOCKET(connect_socket);
  #ifdef _WIN32
          if (wsa_data_init) WSACleanup();
  #endif
      }
      return data;
  }
  
  #endif /* OMITBAD */
  
  #ifndef OMITGOOD
  
  /* goodG2B() uses the GoodSource with the BadSink */
  char * CWE134_Uncontrolled_Format_String__char_connect_socket_vprintf_61b_goodG2B_source(char * data)
  {
      /* FIX: Use a fixed string that does not contain a format specifier */
      strcpy(data, "fixedstringtest");
      return data;
  }
  
  /* goodB2G() uses the BadSource with the GoodSink */
  char * CWE134_Uncontrolled_Format_String__char_connect_socket_vprintf_61b_goodB2G_source(char * data)
  {
      {
  #ifdef _WIN32
          WSADATA wsa_data;
          int wsa_data_init = 0;
  #endif
          int recv_rv;
          struct sockaddr_in s_in;
          char *replace;
          SOCKET connect_socket = INVALID_SOCKET;
          size_t data_len = strlen(data);
          do
          {
  #ifdef _WIN32
              if (WSAStartup(MAKEWORD(2,2), &wsa_data) != NO_ERROR) break;
              wsa_data_init = 1;
  #endif
              connect_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
              if (connect_socket == INVALID_SOCKET) break;
              memset(&s_in, 0, sizeof(s_in));
              s_in.sin_family = AF_INET;
              s_in.sin_addr.s_addr = inet_addr("127.0.0.1");
              s_in.sin_port = htons(TCP_PORT);
              if (connect(connect_socket, (struct sockaddr*)&s_in, sizeof(s_in)) == SOCKET_ERROR) break;
              /* Abort on error or the connection was closed, make sure to recv one
               * less char than is in the recv_buf in order to append a terminator */
              recv_rv = recv(connect_socket, (char *)data+data_len, (int)(100-data_len-1), 0);
              if (recv_rv == SOCKET_ERROR || recv_rv == 0) break;
              /* Append null terminator */
              data[recv_rv] = '\0';
              /* Eliminate CRLF */
              replace = strchr(data, '\r');
              if (replace) *replace = '\0';
              replace = strchr(data, '\n');
              if (replace) *replace = '\0';
          }
          while (0);
          if (connect_socket != INVALID_SOCKET) CLOSE_SOCKET(connect_socket);
  #ifdef _WIN32
          if (wsa_data_init) WSACleanup();
  #endif
      }
      return data;
  }
  
  #endif /* OMITGOOD */
  