diff options
author | Jan200101 <sentrycraft123@gmail.com> | 2022-06-12 22:28:21 +0200 |
---|---|---|
committer | Jan200101 <sentrycraft123@gmail.com> | 2022-06-12 22:28:21 +0200 |
commit | 4e4db5b28319c51a8621cec49ea1aaf8ff78ac2a (patch) | |
tree | 94c11e6165a5675516e92b41f181422b73c7148f | |
parent | f7aa1e4b8d433252e1d30436277dfbdd3555feeb (diff) | |
download | polecat-4e4db5b28319c51a8621cec49ea1aaf8ff78ac2a.tar.gz polecat-4e4db5b28319c51a8621cec49ea1aaf8ff78ac2a.zip |
make net init explicit, fix lutris URL escape invalid read
-rw-r--r-- | cmake/FindJsonC.cmake | 92 | ||||
-rw-r--r-- | cmake/FindLibarchive.cmake | 84 | ||||
-rw-r--r-- | cmake/FindLibcurl.cmake | 82 | ||||
-rw-r--r-- | src/dxvk.c | 5 | ||||
-rw-r--r-- | src/lutris.c | 19 | ||||
-rw-r--r-- | src/net.c | 13 | ||||
-rw-r--r-- | src/net.h | 4 | ||||
-rw-r--r-- | src/wine.c | 15 |
8 files changed, 171 insertions, 143 deletions
diff --git a/cmake/FindJsonC.cmake b/cmake/FindJsonC.cmake index 59cf00a..1d4386b 100644 --- a/cmake/FindJsonC.cmake +++ b/cmake/FindJsonC.cmake @@ -5,59 +5,59 @@ find_package(PkgConfig QUIET) if (PKG_CONFIG_FOUND) - pkg_check_modules(_JSONC json-c) + pkg_check_modules(_JSONC json-c) - if (BUILD_STATIC AND NOT _JSONC_FOUND) - message(FATAL_ERROR "Cannot find static build information") - endif() + if (BUILD_STATIC AND NOT _JSONC_FOUND) + message(FATAL_ERROR "Cannot find static build information") + endif() endif() if (_JSONC_FOUND) # we can rely on pkg-config - if (NOT BUILD_STATIC) - set(JSONC_LIBRARIES ${_JSONC_LIBRARIES}) - set(JSONC_INCLUDE_DIRS ${_JSONC_INCLUDE_DIRS}) - set(JSONC_CFLAGS ${_JSONC_CFLAGS_OTHER}) - else() - set(JSONC_LIBRARIES ${_JSONC_STATIC_LIBRARIES}) - set(JSONC_INCLUDE_DIRS ${_JSONC_STATIC_INCLUDE_DIRS}) - set(JSONC_CFLAGS ${_JSONC_STATIC_CFLAGS_OTHER}) - endif() + if (NOT BUILD_STATIC) + set(JSONC_LIBRARIES ${_JSONC_LIBRARIES}) + set(JSONC_INCLUDE_DIRS ${_JSONC_INCLUDE_DIRS}) + set(JSONC_CFLAGS ${_JSONC_CFLAGS_OTHER}) + else() + set(JSONC_LIBRARIES ${_JSONC_STATIC_LIBRARIES}) + set(JSONC_INCLUDE_DIRS ${_JSONC_STATIC_INCLUDE_DIRS}) + set(JSONC_CFLAGS ${_JSONC_STATIC_CFLAGS_OTHER}) + endif() else() - if(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(_lib_suffix 64) - else() - set(_lib_suffix 32) - endif() + if(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(_lib_suffix 64) + else() + set(_lib_suffix 32) + endif() - find_path(JSONC_INC - NAMES json.h - HINTS - ENV jsoncPath${_lib_suffix} - ENV jsoncPath - ${_JSONC_INCLUDE_DIRS} - PATHS - /usr/include/json-c /usr/local/include/json-c) + find_path(JSONC_INC + NAMES json.h + HINTS + ENV jsoncPath${_lib_suffix} + ENV jsoncPath + ${_JSONC_INCLUDE_DIRS} + PATHS + /usr/include/json-c /usr/local/include/json-c) - find_library(JSONC_LIB - NAMES ${_JSONC_LIBRARIES} jsonc json-c - HINTS - ENV jsoncPath${_lib_suffix} - ENV jsoncPath - ${_JSONC_LIBRARY_DIRS} - ${_JSONC_STATIC_LIBRARY_DIRS} - PATHS - /usr/lib{_lib_suffix} /usr/local/lib{_lib_suffix} - /usr/lib /usr/local/lib) + find_library(JSONC_LIB + NAMES ${_JSONC_LIBRARIES} jsonc json-c + HINTS + ENV jsoncPath${_lib_suffix} + ENV jsoncPath + ${_JSONC_LIBRARY_DIRS} + ${_JSONC_STATIC_LIBRARY_DIRS} + PATHS + /usr/lib{_lib_suffix} /usr/local/lib{_lib_suffix} + /usr/lib /usr/local/lib) - include(FindPackageHandleStandardArgs) - find_package_handle_standard_args(JsonC DEFAULT_MSG JSONC_LIB JSONC_INC) - mark_as_advanced(JSONC_INC JSONC_LIB) + include(FindPackageHandleStandardArgs) + find_package_handle_standard_args(JsonC DEFAULT_MSG JSONC_LIB JSONC_INC) + mark_as_advanced(JSONC_INC JSONC_LIB) - if(JSONC_FOUND) - set(JSONC_INCLUDE_DIRS ${JSONC_INC}) - set(JSONC_LIBRARIES ${JSONC_LIB}) - if (BUILD_STATIC) - set(JSONC_LIBRARIES ${JSONC_LIBRARIES} ${_JSONC_STATIC_LIBRARIES}) - endif() - endif() + if(JSONC_FOUND) + set(JSONC_INCLUDE_DIRS ${JSONC_INC}) + set(JSONC_LIBRARIES ${JSONC_LIB}) + if (BUILD_STATIC) + set(JSONC_LIBRARIES ${JSONC_LIBRARIES} ${_JSONC_STATIC_LIBRARIES}) + endif() + endif() endif()
\ No newline at end of file diff --git a/cmake/FindLibarchive.cmake b/cmake/FindLibarchive.cmake index e34e991..02009aa 100644 --- a/cmake/FindLibarchive.cmake +++ b/cmake/FindLibarchive.cmake @@ -5,55 +5,55 @@ find_package(PkgConfig QUIET) if (PKG_CONFIG_FOUND) - pkg_check_modules(_LIBARCHIVE libarchive) + pkg_check_modules(_LIBARCHIVE libarchive) - if (BUILD_STATIC AND NOT _LIBARCHIVE_FOUND) - message(FATAL_ERROR "Cannot find static build information") - endif() + if (BUILD_STATIC AND NOT _LIBARCHIVE_FOUND) + message(FATAL_ERROR "Cannot find static build information") + endif() endif() if (_LIBARCHIVE_FOUND) # we can rely on pkg-config - if (NOT BUILD_STATIC) - set(LIBARCHIVE_LIBRARIES ${_LIBARCHIVE_LIBRARIES}) - set(LIBARCHIVE_INCLUDE_DIRS ${_LIBARCHIVE_INCLUDE_DIRS}) - set(LIBARCHIVE_CFLAGS ${_LIBARCHIVE_CFLAGS_OTHER}) - else() - set(LIBARCHIVE_LIBRARIES ${_LIBARCHIVE_STATIC_LIBRARIES}) - set(LIBARCHIVE_INCLUDE_DIRS ${_LIBARCHIVE_STATIC_INCLUDE_DIRS}) - set(LIBARCHIVE_CFLAGS ${_LIBARCHIVE_STATIC_CFLAGS_OTHER}) - endif() + if (NOT BUILD_STATIC) + set(LIBARCHIVE_LIBRARIES ${_LIBARCHIVE_LIBRARIES}) + set(LIBARCHIVE_INCLUDE_DIRS ${_LIBARCHIVE_INCLUDE_DIRS}) + set(LIBARCHIVE_CFLAGS ${_LIBARCHIVE_CFLAGS_OTHER}) + else() + set(LIBARCHIVE_LIBRARIES ${_LIBARCHIVE_STATIC_LIBRARIES}) + set(LIBARCHIVE_INCLUDE_DIRS ${_LIBARCHIVE_STATIC_INCLUDE_DIRS}) + set(LIBARCHIVE_CFLAGS ${_LIBARCHIVE_STATIC_CFLAGS_OTHER}) + endif() else() - if(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(_lib_suffix 64) - else() - set(_lib_suffix 32) - endif() + if(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(_lib_suffix 64) + else() + set(_lib_suffix 32) + endif() - find_path(LIBARCHIVE_INC - NAMES archive.h archive_entry.h - HINTS - ENV libarchivePath${_lib_suffix} - ENV libarchivePath - ${_LIBARCHIVE_INCLUDE_DIRS} - PATHS - /usr/include /usr/local/include) + find_path(LIBARCHIVE_INC + NAMES archive.h archive_entry.h + HINTS + ENV libarchivePath${_lib_suffix} + ENV libarchivePath + ${_LIBARCHIVE_INCLUDE_DIRS} + PATHS + /usr/include /usr/local/include) - find_library(LIBARCHIVE_LIB - NAMES archive - HINTS - ENV libarchivePath${_lib_suffix} - ENV libarchivePath - PATHS - /usr/lib{_lib_suffix} /usr/local/lib{_lib_suffix} - /usr/lib /usr/local/lib) + find_library(LIBARCHIVE_LIB + NAMES archive + HINTS + ENV libarchivePath${_lib_suffix} + ENV libarchivePath + PATHS + /usr/lib{_lib_suffix} /usr/local/lib{_lib_suffix} + /usr/lib /usr/local/lib) - include(FindPackageHandleStandardArgs) - find_package_handle_standard_args(Libarchive DEFAULT_MSG LIBARCHIVE_LIB LIBARCHIVE_INC) - mark_as_advanced(LIBARCHIVE_INC LIBARCHIVE_LIB) + include(FindPackageHandleStandardArgs) + find_package_handle_standard_args(Libarchive DEFAULT_MSG LIBARCHIVE_LIB LIBARCHIVE_INC) + mark_as_advanced(LIBARCHIVE_INC LIBARCHIVE_LIB) - if(LIBARCHIVE_FOUND) - set(LIBARCHIVE_INCLUDE_DIRS ${LIBARCHIVE_INC}) - set(LIBARCHIVE_LIBRARIES ${LIBARCHIVE_LIB}) - set(LIBARCHIVE_CFLAGS "") - endif() + if(LIBARCHIVE_FOUND) + set(LIBARCHIVE_INCLUDE_DIRS ${LIBARCHIVE_INC}) + set(LIBARCHIVE_LIBRARIES ${LIBARCHIVE_LIB}) + set(LIBARCHIVE_CFLAGS "") + endif() endif()
\ No newline at end of file diff --git a/cmake/FindLibcurl.cmake b/cmake/FindLibcurl.cmake index aa89105..a940c6e 100644 --- a/cmake/FindLibcurl.cmake +++ b/cmake/FindLibcurl.cmake @@ -5,54 +5,54 @@ find_package(PkgConfig QUIET) if (PKG_CONFIG_FOUND) - pkg_check_modules(_CURL libcurl) + pkg_check_modules(_CURL libcurl) - if (BUILD_STATIC AND NOT _CURL_FOUND) - message(FATAL_ERROR "Cannot find static build information") - endif() + if (BUILD_STATIC AND NOT _CURL_FOUND) + message(FATAL_ERROR "Cannot find static build information") + endif() endif() if (_CURL_FOUND) # we can rely on pkg-config - if (NOT BUILD_STATIC) - set(LIBCURL_LIBRARIES ${_CURL_LIBRARIES}) - set(LIBCURL_INCLUDE_DIRS ${_CURL_INCLUDE_DIRS}) - set(LIBCURL_CFLAGS ${_CURL_CFLAGS_OTHER}) - else() - set(LIBCURL_LIBRARIES ${_CURL_STATIC_LIBRARIES}) - set(LIBCURL_INCLUDE_DIRS ${_CURL_STATIC_INCLUDE_DIRS}) - set(LIBCURL_CFLAGS ${_CURL_STATIC_CFLAGS_OTHER}) - endif() + if (NOT BUILD_STATIC) + set(LIBCURL_LIBRARIES ${_CURL_LIBRARIES}) + set(LIBCURL_INCLUDE_DIRS ${_CURL_INCLUDE_DIRS}) + set(LIBCURL_CFLAGS ${_CURL_CFLAGS_OTHER}) + else() + set(LIBCURL_LIBRARIES ${_CURL_STATIC_LIBRARIES}) + set(LIBCURL_INCLUDE_DIRS ${_CURL_STATIC_INCLUDE_DIRS}) + set(LIBCURL_CFLAGS ${_CURL_STATIC_CFLAGS_OTHER}) + endif() else() - if(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(_lib_suffix 64) - else() - set(_lib_suffix 32) - endif() + if(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(_lib_suffix 64) + else() + set(_lib_suffix 32) + endif() - find_path(CURL_INC - NAMES curl/curl.h - HINTS - ENV curlPath${_lib_suffix} - ENV curlPath - PATHS - /usr/include /usr/local/include) + find_path(CURL_INC + NAMES curl/curl.h + HINTS + ENV curlPath${_lib_suffix} + ENV curlPath + PATHS + /usr/include /usr/local/include) - find_library(CURL_LIB - NAMES curl - HINTS - ENV curlPath${_lib_suffix} - ENV curlPath - PATHS - /usr/lib{_lib_suffix} /usr/local/lib{_lib_suffix} - /usr/lib /usr/local/lib) + find_library(CURL_LIB + NAMES curl + HINTS + ENV curlPath${_lib_suffix} + ENV curlPath + PATHS + /usr/lib{_lib_suffix} /usr/local/lib{_lib_suffix} + /usr/lib /usr/local/lib) - include(FindPackageHandleStandardArgs) - find_package_handle_standard_args(Libcurl DEFAULT_MSG CURL_LIB CURL_INC) - mark_as_advanced(CURL_INC CURL_LIB) + include(FindPackageHandleStandardArgs) + find_package_handle_standard_args(Libcurl DEFAULT_MSG CURL_LIB CURL_INC) + mark_as_advanced(CURL_INC CURL_LIB) - if(LIBCURL_FOUND) - set(LIBCURL_INCLUDE_DIRS ${CURL_INC}) - set(LIBCURL_LIBRARIES ${CURL_LIB}) - set(LIBCURL_CFLAGS "") - endif() + if(LIBCURL_FOUND) + set(LIBCURL_INCLUDE_DIRS ${CURL_INC}) + set(LIBCURL_LIBRARIES ${CURL_LIB}) + set(LIBCURL_CFLAGS "") + endif() endif()
\ No newline at end of file @@ -30,11 +30,11 @@ COMMAND(dxvk, download) { if (argc == 2) { + net_init(); struct json_object* runner = fetchJSON(DXVK_API); if (runner) { - struct json_object* value, *temp, *temp2; uint8_t found = 0; @@ -91,6 +91,7 @@ COMMAND(dxvk, download) json_object_put(runner); } + net_deinit(); } else { @@ -138,6 +139,7 @@ COMMAND(dxvk, remove) COMMAND(dxvk, list) { + net_init(); struct json_object* runner = fetchJSON(DXVK_API); if (runner) @@ -158,6 +160,7 @@ COMMAND(dxvk, list) json_object_put(runner); } + net_deinit(); return EXIT_SUCCESS; } diff --git a/src/lutris.c b/src/lutris.c index 7e94c21..fdf470c 100644 --- a/src/lutris.c +++ b/src/lutris.c @@ -36,6 +36,8 @@ COMMAND(lutris, search) { if (argc > 1 && argv[1][0] != '\0') { + net_init(); + size_t str_size = 0; for (int i = 1; i < argc; ++i) { @@ -49,7 +51,7 @@ COMMAND(lutris, search) // escapeString can return is strlen*3 str_size *= 3; - char* str = malloc(str_size); + char* str = malloc(str_size+1); if (!str) return 1; str[0] = '\0'; @@ -58,7 +60,7 @@ COMMAND(lutris, search) if (i != 1) strncat(str, " ", str_size); strncat(str, argv[i], str_size); } - str[str_size-1] = '\0'; + str[str_size] = '\0'; lutris_escapeString(str, str_size); char* url = malloc(strlen(LUTRIS_GAME_SEARCH_API) + strlen(str)); @@ -89,6 +91,7 @@ COMMAND(lutris, search) json_object_put(queryresult); } + net_deinit(); } else { @@ -102,6 +105,8 @@ COMMAND(lutris, list) { if (argc == 2) { + net_init(); + // argv being modifyable is not always a given so lets // lets make a mutable copy char* str = strdup(argv[1]); @@ -145,6 +150,7 @@ COMMAND(lutris, list) json_object_put(queryresult); } + net_deinit(); } else { @@ -158,6 +164,7 @@ COMMAND(lutris, install) { if (argc == 2) { + net_init(); struct script_t installer = lutris_getInstaller(argv[1]); if (installer.error == NONE) @@ -310,6 +317,7 @@ COMMAND(lutris, install) } lutris_freeInstaller(&installer); + net_deinit(); } return EXIT_SUCCESS; } @@ -318,6 +326,7 @@ COMMAND(lutris, info) { if (argc == 2) { + net_init(); struct script_t installer = lutris_getInstaller(argv[1]); if (installer.error > NO_SLUG || installer.error == NONE) @@ -389,6 +398,7 @@ COMMAND(lutris, info) } lutris_freeInstaller(&installer); + net_deinit(); } else { @@ -401,9 +411,12 @@ COMMAND_HELP(lutris, " lutris") void lutris_escapeString(char* str, size_t size) { + if (!str || !*str) + return; + char* tail = str + size; - while (str != tail) + while (*str && str < tail) { switch (*str) { @@ -9,6 +9,16 @@ #include "net.h" #include "common.h" +void net_init() +{ + curl_global_init(CURL_GLOBAL_ALL); +} + +void net_deinit() +{ + curl_global_cleanup(); +} + static inline size_t memoryCallback(const void* contents, size_t size, size_t nmemb, void* userp) { size_t realsize = size * nmemb; @@ -65,8 +75,6 @@ struct MemoryStruct* downloadToRam(const char* URL, int progress) chunk->memory[0] = 0; chunk->size = 0; - curl_global_init(CURL_GLOBAL_ALL); - curl_handle = curl_easy_init(); curl_easy_setopt(curl_handle, CURLOPT_URL, URL); @@ -99,7 +107,6 @@ struct MemoryStruct* downloadToRam(const char* URL, int progress) } curl_easy_cleanup(curl_handle); - curl_global_cleanup(); } else { @@ -4,9 +4,9 @@ #include <curl/curl.h> #include <json.h> -#define TIMEOPT CURLINFO_TOTAL_TIME_T +void net_init(); +void net_deinit(); -size_t WriteMemoryCallback(void*, size_t, size_t, void*); struct MemoryStruct* downloadToRam(const char* URL, int); void downloadToFile(const char*, const char*, int); struct json_object* fetchJSON(const char*); @@ -35,6 +35,7 @@ COMMAND(winecmd, download) { if (argc >= 2) { + net_init(); struct json_object* runner = fetchJSON(WINE_API); if (runner) @@ -98,11 +99,13 @@ COMMAND(winecmd, download) json_object_put(runner); } + net_deinit(); } else { fprintf(stderr, USAGE_STR " wine download [versions]\n\nversions are obtained via '" NAME " wine list'\n"); } + return EXIT_SUCCESS; } @@ -160,6 +163,7 @@ COMMAND(winecmd, remove) COMMAND(winecmd, list) { + net_init(); struct json_object* runner = fetchJSON(WINE_API); if (runner) @@ -182,6 +186,7 @@ COMMAND(winecmd, list) json_object_put(runner); } + net_deinit(); return EXIT_SUCCESS; } @@ -346,7 +351,7 @@ COMMAND(winecmd, env) printf("To add a wine installation to your PATH\n" "you have to eval the output.\n\n"); if (!fish_env) - printf("$ eval 'polecat wine env %s'\n", winever); + printf("$ eval `polecat wine env %s`\n", winever); else printf("$ eval (polecat wine fish-env %s)\n", winever); } @@ -385,8 +390,8 @@ enum wine_type_t check_wine_ver(char* winepath, size_t size) winepathcopy = malloc(size); if (winepathcopy) { - strncpy(winepathcopy, winepath, size); - strncat(winepathcopy, WINEBIN, size - strlen(winepathcopy)); + strncpy(winepathcopy, winepath, size - 1); + strncat(winepathcopy, WINEBIN, size - strlen(winepathcopy) - 1); if (isFile(winepathcopy)) { @@ -394,8 +399,8 @@ enum wine_type_t check_wine_ver(char* winepath, size_t size) return WINE_NORMAL; } - strncpy(winepathcopy, winepath, size); - strncat(winepathcopy, PROTONBIN, size - strlen(winepathcopy)); + strncpy(winepathcopy, winepath, size - 1); + strncat(winepathcopy, PROTONBIN, size - strlen(winepathcopy) - 1); if (isFile(winepathcopy)) { |