diff options
author | Aaron Plattner <aplattner@nvidia.com> | 2014-05-30 13:47:04 -0700 |
---|---|---|
committer | Aaron Plattner <aplattner@nvidia.com> | 2014-05-30 13:47:04 -0700 |
commit | 57edcc2307731f0f28710390106670358927bc35 (patch) | |
tree | 782317fd68ff05e95b87ede75d2a30eea931b51c | |
parent | 35b8b105ffeeb785bb6776c1cda33eb244ee1580 (diff) |
337.25337.25
-rw-r--r-- | command-list.c | 6 | ||||
-rw-r--r-- | files.c | 43 | ||||
-rw-r--r-- | install-from-cwd.c | 64 | ||||
-rw-r--r-- | manifest.c | 117 | ||||
-rw-r--r-- | misc.c | 99 | ||||
-rw-r--r-- | nvidia-installer.h | 1 | ||||
-rw-r--r-- | version.mk | 2 |
7 files changed, 187 insertions, 145 deletions
diff --git a/command-list.c b/command-list.c index 6b2c33c..1ff75e7 100644 --- a/command-list.c +++ b/command-list.c @@ -277,12 +277,10 @@ CommandList *build_command_list(Options *op, Package *p) nvfree(tmp); /* - * delete the temporary libGL.la and .desktop files generated - * based on templates earlier. + * delete any temporary generated files */ - if ((p->entries[i].type == FILE_TYPE_LIBGL_LA) || - (p->entries[i].type == FILE_TYPE_DOT_DESKTOP)) { + if (p->entries[i].caps.is_temporary) { add_command(c, DELETE_CMD, p->entries[i].file); } @@ -308,30 +308,37 @@ char *write_temp_file(Options *op, const int len, goto done; } - /* set the temporary file's size */ + /* If a length of zero or a NULL data pointer was provided, skip writing + * to the file and just set the desired permissions. */ - if (lseek(fd, len - 1, SEEK_SET) == -1) { - ui_warn(op, "Unable to set file size for temporary file (%s).", - strerror(errno)); - goto done; - } - if (write(fd, "", 1) != 1) { - ui_warn(op, "Unable to write file size for temporary file (%s).", - strerror(errno)); - goto done; - } - - /* mmap the temporary file */ + if (len && data) { - if ((dst = mmap(0, len, PROT_READ | PROT_WRITE, + /* set the temporary file's size */ + + if (lseek(fd, len - 1, SEEK_SET) == -1) { + ui_warn(op, "Unable to set file size for temporary file (%s).", + strerror(errno)); + goto done; + } + if (write(fd, "", 1) != 1) { + ui_warn(op, "Unable to write file size for temporary file (%s).", + strerror(errno)); + goto done; + } + + /* mmap the temporary file */ + + if ((dst = mmap(0, len, PROT_READ | PROT_WRITE, MAP_FILE | MAP_SHARED, fd, 0)) == (void *) -1) { ui_warn(op, "Unable to map temporary file (%s).", strerror(errno)); goto done; - } - - /* copy the data out to the file */ + + } - memcpy(dst, data, len); + /* copy the data out to the file */ + + memcpy(dst, data, len); + } /* set the desired permissions on the file */ diff --git a/install-from-cwd.c b/install-from-cwd.c index ff73644..7b5542e 100644 --- a/install-from-cwd.c +++ b/install-from-cwd.c @@ -47,11 +47,6 @@ #include "sanity.h" #include "manifest.h" -/* default names for generated signing keys */ - -#define SECKEY_NAME "tmp.key" -#define PUBKEY_NAME "tmp.der" - /* local prototypes */ @@ -1173,8 +1168,8 @@ static int assisted_module_signing(Options *op, Package *p) "one?") == 1); if (generate_keys) { - char *cmdline, *x509_hash; - int ret; + char *cmdline, *x509_hash, *private_key_path, *public_key_path; + int ret, generate_failed = FALSE; if (!op->utils[OPENSSL]) { ui_error(op, "Unable to generate key pair: openssl not " @@ -1239,6 +1234,18 @@ guess_fail: log_printf(op, NULL, "Generating key pair for module signing..."); + /* Generate temporary files for the signing key and certificate */ + + private_key_path = write_temp_file(op, 0, NULL, 0600); + public_key_path = write_temp_file(op, 0, NULL, 0644); + + if (!private_key_path || !public_key_path) { + ui_error(op, "Failed to create one or more temporary files for " + "the module signing keys."); + generate_failed = TRUE; + goto generate_done; + } + /* Generate a key pair using openssl. * XXX We assume that sign-file requires the X.509 certificate * in DER format; if this changes in the future we will need @@ -1248,8 +1255,9 @@ guess_fail: op->utils[OPENSSL], " req -new -x509 -newkey " "rsa:2048 -days 7300 -nodes -subj " "\"/CN=nvidia-installer generated signing key/\"" - " -keyout " SECKEY_NAME " -outform DER -out " - PUBKEY_NAME, " -", x509_hash, NULL); + " -keyout ", private_key_path, + " -outform DER -out ", public_key_path, + " -", x509_hash, NULL); nvfree(x509_hash); ret = run_command(op, cmdline, NULL, TRUE, 8, TRUE); @@ -1258,16 +1266,24 @@ guess_fail: if (ret != 0) { ui_error(op, "Failed to generate key pair!"); - return FALSE; + generate_failed = TRUE; + goto generate_done; } log_printf(op, NULL, "Signing keys generated successfully."); - /* Set the signing keys to the newly generated pair. The paths - * are relative to p->kernel_module_build_directory, since we - * cd to it before signing the module. */ - op->module_signing_secret_key = SECKEY_NAME; - op->module_signing_public_key = PUBKEY_NAME; + /* Set the signing keys to the newly generated pair. */ + + op->module_signing_secret_key = nvstrdup(private_key_path); + op->module_signing_public_key = nvstrdup(public_key_path); + +generate_done: + nvfree(private_key_path); + nvfree(public_key_path); + + if (generate_failed) { + return FALSE; + } } else { /* The user already has keys; prompt for their locations. */ op->module_signing_secret_key = @@ -1315,7 +1331,7 @@ guess_fail: /* If keys were generated, we should install the verification cert * so that the user can make the kernel trust it, and either delete * or install the private signing key. */ - char *file, *name, *result = NULL, *fingerprint, *cmdline; + char *name, *result = NULL, *fingerprint, *cmdline; char short_fingerprint[9]; int ret, delete_secret_key; @@ -1328,8 +1344,8 @@ guess_fail: openssl to create a keypair at this point, so we know we have it; otherwise, we would have already returned by now. */ cmdline = nvstrcat(op->utils[OPENSSL], " x509 -noout -fingerprint ", - "-inform DER -in ", p->kernel_module_build_directory, - "/"PUBKEY_NAME, NULL); + "-inform DER -in ", op->module_signing_public_key, + NULL); ret = run_command(op, cmdline, &result, FALSE, 0, FALSE); nvfree(cmdline); @@ -1342,8 +1358,8 @@ guess_fail: if (sha1sum) { /* the openssl command failed, or we parsed its output * incorrectly; try to get a sha1sum of the DER certificate */ - cmdline = nvstrcat(sha1sum, p->kernel_module_build_directory, - "/"PUBKEY_NAME, NULL); + cmdline = nvstrcat(sha1sum, " ", op->module_signing_public_key, + NULL); ret = run_command(op, cmdline, &result, FALSE, 0, FALSE); nvfree(sha1sum); nvfree(cmdline); @@ -1368,13 +1384,12 @@ guess_fail: short_fingerprint[sizeof(short_fingerprint) - 1] = '\0'; /* Add the public key to the package */ - file = nvstrcat(p->kernel_module_build_directory, "/"PUBKEY_NAME, NULL); /* XXX name will be leaked when freeing package */ name = nvstrcat("nvidia-modsign-crt-", short_fingerprint, ".der", NULL); add_package_entry(p, - file, + nvstrdup(op->module_signing_public_key), NULL, /* path */ name, NULL, /* target */ @@ -1395,10 +1410,9 @@ guess_fail: nvfree(result); /* Delete or install the private key */ - file = nvstrcat(p->kernel_module_build_directory, "/"SECKEY_NAME, NULL); if (delete_secret_key) { - secure_delete(op, file); + secure_delete(op, op->module_signing_secret_key); } else { /* Add the private key to the package */ @@ -1407,7 +1421,7 @@ guess_fail: NULL); add_package_entry(p, - file, + nvstrdup(op->module_signing_secret_key), NULL, /* path */ name, NULL, /* target */ @@ -31,7 +31,8 @@ _has_path, \ _is_symlink, \ _is_shared_lib, \ - _is_opengl) \ + _is_opengl, \ + _is_temporary) \ #_name , FILE_TYPE_ ## _name , \ { \ .has_arch = _has_arch, \ @@ -40,7 +41,8 @@ .has_path = _has_path, \ .is_symlink = _is_symlink, \ .is_shared_lib = _is_shared_lib, \ - .is_opengl = _is_opengl \ + .is_opengl = _is_opengl, \ + .is_temporary = _is_temporary, \ } /* @@ -54,61 +56,62 @@ static const struct { } packageEntryFileTypeTable[] = { /* - * is_opengl ---------------------------------+ - * is_shared_lib ------------------------------+ | - * is_symlink ---------------------------+ | | - * has_path ------------------------+ | | | - * installable ---------------------+ | | | | - * has_tls_class ------------------+ | | | | | - * has_arch ---------------+ | | | | | | - * | | | | | | | + * is_temporary ------------------------------------+ + * is_opengl ---------------------------------+ | + * is_shared_lib ------------------------------+ | | + * is_symlink ---------------------------+ | | | + * has_path ------------------------+ | | | | + * installable ---------------------+ | | | | | + * has_tls_class ------------------+ | | | | | | + * has_arch ---------------+ | | | | | | | + * | | | | | | | | */ - { ENTRY(KERNEL_MODULE_SRC, F, F, T, F, F, F, F ) }, - { ENTRY(KERNEL_MODULE_CMD, F, F, F, F, F, F, F ) }, - { ENTRY(KERNEL_MODULE, F, F, T, F, F, F, F ) }, - { ENTRY(OPENGL_HEADER, F, F, T, T, F, F, T ) }, - { ENTRY(CUDA_ICD, F, F, T, F, F, F, F ) }, - { ENTRY(OPENGL_LIB, T, F, T, F, F, T, T ) }, - { ENTRY(CUDA_LIB, T, F, T, T, F, T, F ) }, - { ENTRY(LIBGL_LA, T, F, T, F, F, F, T ) }, - { ENTRY(XLIB_STATIC_LIB, F, F, T, F, F, F, F ) }, - { ENTRY(XLIB_SHARED_LIB, F, F, T, F, F, T, F ) }, - { ENTRY(TLS_LIB, T, T, T, T, F, T, T ) }, - { ENTRY(UTILITY_LIB, T, F, T, F, F, T, F ) }, - { ENTRY(DOCUMENTATION, F, F, T, T, F, F, F ) }, - { ENTRY(APPLICATION_PROFILE, F, F, T, T, F, F, F ) }, - { ENTRY(MANPAGE, F, F, T, T, F, F, F ) }, - { ENTRY(EXPLICIT_PATH, F, F, T, T, F, F, F ) }, - { ENTRY(OPENGL_SYMLINK, T, F, F, F, T, F, T ) }, - { ENTRY(CUDA_SYMLINK, T, F, F, T, T, F, F ) }, - { ENTRY(XLIB_SYMLINK, F, F, F, F, T, F, F ) }, - { ENTRY(TLS_SYMLINK, T, T, F, T, T, F, T ) }, - { ENTRY(UTILITY_LIB_SYMLINK, T, F, F, F, T, F, F ) }, - { ENTRY(INSTALLER_BINARY, F, F, T, F, F, F, F ) }, - { ENTRY(UTILITY_BINARY, F, F, T, F, F, F, F ) }, - { ENTRY(UTILITY_BIN_SYMLINK, F, F, F, F, T, F, F ) }, - { ENTRY(DOT_DESKTOP, F, F, T, T, F, F, F ) }, - { ENTRY(XMODULE_SHARED_LIB, F, F, T, T, F, T, F ) }, - { ENTRY(XMODULE_SYMLINK, F, F, F, T, T, F, F ) }, - { ENTRY(GLX_MODULE_SHARED_LIB, F, F, T, T, F, T, T ) }, - { ENTRY(GLX_MODULE_SYMLINK, F, F, F, T, T, F, T ) }, - { ENTRY(XMODULE_NEWSYM, F, F, F, T, T, F, F ) }, - { ENTRY(VDPAU_LIB, T, F, T, T, F, T, F ) }, - { ENTRY(VDPAU_WRAPPER_LIB, T, F, T, T, F, T, F ) }, - { ENTRY(VDPAU_SYMLINK, T, F, F, T, T, F, F ) }, - { ENTRY(VDPAU_WRAPPER_SYMLINK, T, F, F, T, T, F, F ) }, - { ENTRY(NVCUVID_LIB, T, F, T, F, F, T, F ) }, - { ENTRY(NVCUVID_LIB_SYMLINK, T, F, F, F, T, F, F ) }, - { ENTRY(ENCODEAPI_LIB, T, F, T, F, F, T, F ) }, - { ENTRY(ENCODEAPI_LIB_SYMLINK, T, F, F, F, T, F, F ) }, - { ENTRY(VGX_LIB, F, F, T, F, F, T, F ) }, - { ENTRY(VGX_LIB_SYMLINK, F, F, F, F, T, F, F ) }, - { ENTRY(NVIDIA_MODPROBE, F, F, T, T, F, F, F ) }, - { ENTRY(NVIDIA_MODPROBE_MANPAGE,F, F, T, T, F, F, F ) }, - { ENTRY(MODULE_SIGNING_KEY, F, F, T, F, F, F, F ) }, - { ENTRY(NVIFR_LIB, T, F, T, F, F, T, F ) }, - { ENTRY(NVIFR_LIB_SYMLINK, T, F, F, F, T, F, F ) }, - { ENTRY(UVM_MODULE_SRC, F, F, T, F, F, F, F ) }, + { ENTRY(KERNEL_MODULE_SRC, F, F, T, F, F, F, F, F ) }, + { ENTRY(KERNEL_MODULE_CMD, F, F, F, F, F, F, F, F ) }, + { ENTRY(KERNEL_MODULE, F, F, T, F, F, F, F, F ) }, + { ENTRY(OPENGL_HEADER, F, F, T, T, F, F, T, F ) }, + { ENTRY(CUDA_ICD, F, F, T, F, F, F, F, F ) }, + { ENTRY(OPENGL_LIB, T, F, T, F, F, T, T, F ) }, + { ENTRY(CUDA_LIB, T, F, T, T, F, T, F, F ) }, + { ENTRY(LIBGL_LA, T, F, T, F, F, F, T, T ) }, + { ENTRY(XLIB_STATIC_LIB, F, F, T, F, F, F, F, F ) }, + { ENTRY(XLIB_SHARED_LIB, F, F, T, F, F, T, F, F ) }, + { ENTRY(TLS_LIB, T, T, T, T, F, T, T, F ) }, + { ENTRY(UTILITY_LIB, T, F, T, F, F, T, F, F ) }, + { ENTRY(DOCUMENTATION, F, F, T, T, F, F, F, F ) }, + { ENTRY(APPLICATION_PROFILE, F, F, T, T, F, F, F, F ) }, + { ENTRY(MANPAGE, F, F, T, T, F, F, F, F ) }, + { ENTRY(EXPLICIT_PATH, F, F, T, T, F, F, F, F ) }, + { ENTRY(OPENGL_SYMLINK, T, F, F, F, T, F, T, F ) }, + { ENTRY(CUDA_SYMLINK, T, F, F, T, T, F, F, F ) }, + { ENTRY(XLIB_SYMLINK, F, F, F, F, T, F, F, F ) }, + { ENTRY(TLS_SYMLINK, T, T, F, T, T, F, T, F ) }, + { ENTRY(UTILITY_LIB_SYMLINK, T, F, F, F, T, F, F, F ) }, + { ENTRY(INSTALLER_BINARY, F, F, T, F, F, F, F, F ) }, + { ENTRY(UTILITY_BINARY, F, F, T, F, F, F, F, F ) }, + { ENTRY(UTILITY_BIN_SYMLINK, F, F, F, F, T, F, F, F ) }, + { ENTRY(DOT_DESKTOP, F, F, T, T, F, F, F, T ) }, + { ENTRY(XMODULE_SHARED_LIB, F, F, T, T, F, T, F, F ) }, + { ENTRY(XMODULE_SYMLINK, F, F, F, T, T, F, F, F ) }, + { ENTRY(GLX_MODULE_SHARED_LIB, F, F, T, T, F, T, T, F ) }, + { ENTRY(GLX_MODULE_SYMLINK, F, F, F, T, T, F, T, F ) }, + { ENTRY(XMODULE_NEWSYM, F, F, F, T, T, F, F, F ) }, + { ENTRY(VDPAU_LIB, T, F, T, T, F, T, F, F ) }, + { ENTRY(VDPAU_WRAPPER_LIB, T, F, T, T, F, T, F, F ) }, + { ENTRY(VDPAU_SYMLINK, T, F, F, T, T, F, F, F ) }, + { ENTRY(VDPAU_WRAPPER_SYMLINK, T, F, F, T, T, F, F, F ) }, + { ENTRY(NVCUVID_LIB, T, F, T, F, F, T, F, F ) }, + { ENTRY(NVCUVID_LIB_SYMLINK, T, F, F, F, T, F, F, F ) }, + { ENTRY(ENCODEAPI_LIB, T, F, T, F, F, T, F, F ) }, + { ENTRY(ENCODEAPI_LIB_SYMLINK, T, F, F, F, T, F, F, F ) }, + { ENTRY(VGX_LIB, F, F, T, F, F, T, F, F ) }, + { ENTRY(VGX_LIB_SYMLINK, F, F, F, F, T, F, F, F ) }, + { ENTRY(NVIDIA_MODPROBE, F, F, T, T, F, F, F, F ) }, + { ENTRY(NVIDIA_MODPROBE_MANPAGE,F, F, T, T, F, F, F, F ) }, + { ENTRY(MODULE_SIGNING_KEY, F, F, T, F, F, F, F, T ) }, + { ENTRY(NVIFR_LIB, T, F, T, F, F, T, F, F ) }, + { ENTRY(NVIFR_LIB_SYMLINK, T, F, F, F, T, F, F, F ) }, + { ENTRY(UVM_MODULE_SRC, F, F, T, F, F, F, F, F ) }, }; /* @@ -120,7 +123,7 @@ PackageEntryFileCapabilities get_file_type_capabilities( ) { int i; - PackageEntryFileCapabilities nullCaps = { F, F, F, F, F, F, F }; + PackageEntryFileCapabilities nullCaps = { F, F, F, F, F, F, F, F }; for (i = 0; i < ARRAY_LEN(packageEntryFileTypeTable); i++) { if (type == packageEntryFileTypeTable[i].type) { @@ -632,6 +632,7 @@ int find_module_utils(Options *op) */ #define PROC_MODPROBE_PATH_FILE "/proc/sys/kernel/modprobe" +#define DEFAULT_MODPROBE "/sbin/modprobe" int check_proc_modprobe_path(Options *op) { @@ -648,8 +649,7 @@ int check_proc_modprobe_path(Options *op) fclose(fp); } - /* If either the modprobe utility reported at /proc/sys/kernel/modprobe or - * the one found by find_system_utils() is a symlink, resolve its target. */ + /* If the modprobe found by find_system_utils() is a symlink, resolve it */ ret = lstat(found_modprobe, &st); @@ -661,6 +661,9 @@ int check_proc_modprobe_path(Options *op) } if (proc_modprobe) { + + /* If the modprobe reported by the kernel is a symlink, resolve it */ + ret = lstat(proc_modprobe, &st); if (ret == 0 && S_ISLNK(st.st_mode)) { @@ -670,53 +673,69 @@ int check_proc_modprobe_path(Options *op) proc_modprobe = target; } } - } - if (proc_modprobe && strcmp(proc_modprobe, found_modprobe)) { - if (access(proc_modprobe, F_OK | X_OK) == 0) { - ui_warn(op, "The path to the `modprobe` utility reported by " - "'%s', `%s`, differs from the path determined by " - "`nvidia-installer`, `%s`. Please verify that `%s` " - "works correctly and correct the path in '%s' if " - "it does not.", - PROC_MODPROBE_PATH_FILE, proc_modprobe, found_modprobe, - proc_modprobe, PROC_MODPROBE_PATH_FILE); + /* Check to see if the modprobe reported by the kernel and the + * modprobe found by nvidia-installer match. */ + + if (strcmp(proc_modprobe, found_modprobe) == 0) { success = TRUE; } else { - ui_error(op, "The path to the `modprobe` utility reported by " - "'%s', `%s`, differs from the path determined by " - "`nvidia-installer`, `%s`, and does not appear to " - "point to a valid `modprobe` binary. Please correct " - "the path in '%s'.", - PROC_MODPROBE_PATH_FILE, proc_modprobe, found_modprobe, - PROC_MODPROBE_PATH_FILE); + if (access(proc_modprobe, F_OK | X_OK) == 0) { + ui_warn(op, "The path to the `modprobe` utility reported by " + "'%s', `%s`, differs from the path determined by " + "`nvidia-installer`, `%s`. Please verify that `%s` " + "works correctly and correct the path in '%s' if " + "it does not.", + PROC_MODPROBE_PATH_FILE, proc_modprobe, found_modprobe, + proc_modprobe, PROC_MODPROBE_PATH_FILE); + success = TRUE; + } else { + ui_error(op, "The path to the `modprobe` utility reported by " + "'%s', `%s`, differs from the path determined by " + "`nvidia-installer`, `%s`, and does not appear to " + "point to a valid `modprobe` binary. Please correct " + "the path in '%s'.", + PROC_MODPROBE_PATH_FILE, proc_modprobe, found_modprobe, + PROC_MODPROBE_PATH_FILE); + } } - } else if (!proc_modprobe && strcmp("/sbin/modprobe", found_modprobe)) { - if (access(proc_modprobe, F_OK | X_OK) == 0) { - ui_warn(op, "The file '%s' is unavailable, the X server will " - "use `/sbin/modprobe` as the path to the `modprobe` " - "utility. This path differs from the one determined " - "by `nvidia-installer`, `%s`. Please verify that " - "`/sbin/modprobe` works correctly or mount the /proc " - "file system and verify that '%s' reports the " - "correct path.", - PROC_MODPROBE_PATH_FILE, found_modprobe, + } else { + /* We failed to read from /proc/sys/kernel/modprobe, possibly because + * it doesn't exist or /proc isn't mounted. Assume a default modprobe + * path of /sbin/modprobe. */ + + char * found_mismatch; + + if (strcmp(DEFAULT_MODPROBE, found_modprobe) == 0) { + found_mismatch = nvstrdup(""); + } else { + found_mismatch = nvstrcat("This path differs from the one " + "determined by `nvidia-installer`, ", + found_modprobe, ". ", NULL); + } + + if (access(DEFAULT_MODPROBE, F_OK | X_OK) == 0) { + ui_warn(op, "The file '%s' is unavailable; the X server will " + "use `" DEFAULT_MODPROBE "` as the path to the `modprobe` " + "utility. %sPlease verify that `" DEFAULT_MODPROBE + "` works correctly or mount the /proc file system and " + "verify that '%s' reports the correct path.", + PROC_MODPROBE_PATH_FILE, found_mismatch, PROC_MODPROBE_PATH_FILE); success = TRUE; } else { - ui_error(op, "The file '%s' is unavailable, the X server will " - "use `/sbin/modprobe` as the path to the `modprobe` " - "utility. This path differs from the one determined " - "by `nvidia-installer`, `%s`, and does not appear to " - "point to a valid `modprobe` binary. Please create " - "a symbolic link from `/sbin/modprobe` to `%s` or " - "mount the /proc file system and verify that '%s' " - "reports the correct path.", - PROC_MODPROBE_PATH_FILE, found_modprobe, + ui_error(op, "The file '%s' is unavailable; the X server will " + "use `" DEFAULT_MODPROBE "` as the path to the `modprobe` " + "utility. %s`" DEFAULT_MODPROBE "` does not appear to " + "point to a valid `modprobe` binary. Please create a " + "symbolic link from `" DEFAULT_MODPROBE "` to `%s` or " + "mount the /proc file system and verify that '%s' reports " + "the correct path.", + PROC_MODPROBE_PATH_FILE, found_mismatch, found_modprobe, PROC_MODPROBE_PATH_FILE); } - } else if (strcmp(proc_modprobe, found_modprobe) == 0) { - success = TRUE; + + nvfree(found_mismatch); } nvfree(proc_modprobe); diff --git a/nvidia-installer.h b/nvidia-installer.h index 189a17b..b781be6 100644 --- a/nvidia-installer.h +++ b/nvidia-installer.h @@ -315,6 +315,7 @@ typedef struct { unsigned int is_symlink : 1; unsigned int is_shared_lib : 1; unsigned int is_opengl : 1; + unsigned int is_temporary : 1; } PackageEntryFileCapabilities; /* @@ -1 +1 @@ -NVIDIA_VERSION = 337.19 +NVIDIA_VERSION = 337.25 |