summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaron Plattner <aplattner@nvidia.com>2014-05-30 13:47:04 -0700
committerAaron Plattner <aplattner@nvidia.com>2014-05-30 13:47:04 -0700
commit57edcc2307731f0f28710390106670358927bc35 (patch)
tree782317fd68ff05e95b87ede75d2a30eea931b51c
parent35b8b105ffeeb785bb6776c1cda33eb244ee1580 (diff)
337.25337.25
-rw-r--r--command-list.c6
-rw-r--r--files.c43
-rw-r--r--install-from-cwd.c64
-rw-r--r--manifest.c117
-rw-r--r--misc.c99
-rw-r--r--nvidia-installer.h1
-rw-r--r--version.mk2
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);
}
diff --git a/files.c b/files.c
index 592b9c8..6d52237 100644
--- a/files.c
+++ b/files.c
@@ -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 */
diff --git a/manifest.c b/manifest.c
index edeb9c2..45c8dec 100644
--- a/manifest.c
+++ b/manifest.c
@@ -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) {
diff --git a/misc.c b/misc.c
index 5d2b589..51f0973 100644
--- a/misc.c
+++ b/misc.c
@@ -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;
/*
diff --git a/version.mk b/version.mk
index 5b4f9bc..dea0f65 100644
--- a/version.mk
+++ b/version.mk
@@ -1 +1 @@
-NVIDIA_VERSION = 337.19
+NVIDIA_VERSION = 337.25