Skip to content

Commit 98de0bc

Browse files
authored
Merge pull request #450 from oliverkurth/stable-3.5
version 3.5.5
2 parents d6272d7 + 27b952b commit 98de0bc

22 files changed

+628
-321
lines changed

CMakeLists.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
CMAKE_MINIMUM_REQUIRED(VERSION 3.0 FATAL_ERROR)
1010

11-
project(tdnf VERSION 3.5.4 LANGUAGES C)
11+
project(tdnf VERSION 3.5.5 LANGUAGES C)
1212
set(VERSION ${PROJECT_VERSION})
1313
set(PROJECT_YEAR 2023)
1414

client/api.c

+5
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,11 @@ static void IsTdnfAlreadyRunning(void);
3131

3232
static void TdnfExitHandler(void)
3333
{
34+
if (gEuid)
35+
{
36+
return;
37+
}
38+
3439
tdnflockFree(instance_lock);
3540
}
3641

client/defines.h

+4-2
Original file line numberDiff line numberDiff line change
@@ -236,8 +236,8 @@ typedef enum
236236
{ERROR_TDNF_METADATA_EXPIRE_PARSE, "ERROR_TDNF_METADATA_EXPIRE_PARSE", "metadata_expire value could not be parsed. Check your repo files."},\
237237
{ERROR_TDNF_PROTECTED, "ERROR_TDNF_PROTECTED", "The operation would result in removing a protected package."},\
238238
{ERROR_TDNF_DOWNGRADE_NOT_ALLOWED,\
239-
"ERROR_TDNF_DOWNGRADE_NOT_ALLOWED",\
240-
"a downgrade is not allowed below the minimal version. Check 'minversions' in the configuration."},\
239+
"ERROR_TDNF_DOWNGRADE_NOT_ALLOWED",\
240+
"a downgrade is not allowed below the minimal version. Check 'minversions' in the configuration."},\
241241
{ERROR_TDNF_PERM, "ERROR_TDNF_PERM", "Operation not permitted. You have to be root."},\
242242
{ERROR_TDNF_OPT_NOT_FOUND, "ERROR_TDNF_OPT_NOT_FOUND", "A required option was not found"},\
243243
{ERROR_TDNF_OPERATION_ABORTED, "ERROR_TDNF_OPERATION_ABORTED", "Operation aborted."},\
@@ -248,6 +248,8 @@ typedef enum
248248
{ERROR_TDNF_EVENT_CTXT_ITEM_INVALID_TYPE, "ERROR_TDNF_EVENT_CTXT_ITEM_INVALID_TYPE", "An event item type had a mismatch. This is usually related to plugin events. Try --noplugins to deactivate all plugins or --disableplugin=<plugin> to deactivate a specific one. You can permanently deactivate an offending plugin by setting enable=0 in the plugin config file."},\
249249
{ERROR_TDNF_NO_GPGKEY_CONF_ENTRY, "ERROR_TDNF_NO_GPGKEY_CONF_ENTRY", "gpgkey entry is missing for this repo. please add gpgkey in repo file or use --nogpgcheck to ignore."}, \
250250
{ERROR_TDNF_URL_INVALID, "ERROR_TDNF_URL_INVALID", "URL is invalid."}, \
251+
{ERROR_TDNF_SIZE_MISMATCH, "ERROR_TDNF_SIZE_MISMATCH", "File size does not match."}, \
252+
{ERROR_TDNF_CHECKSUM_MISMATCH, "ERROR_TDNF_CHECKSUM_MISMATCH", "File checksum does not match."}, \
251253
{ERROR_TDNF_BASEURL_DOES_NOT_EXISTS, "ERROR_TDNF_BASEURL_DOES_NOT_EXISTS", "Base URL and Metalink URL not found in the repo file"},\
252254
{ERROR_TDNF_CHECKSUM_VALIDATION_FAILED, "ERROR_TDNF_CHECKSUM_VALIDATION_FAILED", "Checksum Validation failed for the repomd.xml downloaded using URL from metalink"},\
253255
{ERROR_TDNF_METALINK_RESOURCE_VALIDATION_FAILED, "ERROR_TDNF_METALINK_RESOURCE_VALIDATION_FAILED", "No Resource present in metalink file for file download"},\

client/includes.h

-9
Original file line numberDiff line numberDiff line change
@@ -63,13 +63,4 @@
6363

6464
#include "config.h"
6565

66-
// Enum in order of preference
67-
enum {
68-
TDNF_HASH_MD5 = 0,
69-
TDNF_HASH_SHA1,
70-
TDNF_HASH_SHA256,
71-
TDNF_HASH_SHA512,
72-
TDNF_HASH_SENTINEL
73-
};
74-
7566
#endif /* __CLIENT_INCLUDES_H__ */

client/packageutils.c

+29
Original file line numberDiff line numberDiff line change
@@ -944,6 +944,7 @@ TDNFPopulatePkgInfos(
944944
Id dwPkgId = 0;
945945
PTDNF_PKG_INFO pPkgInfos = NULL;
946946
PTDNF_PKG_INFO pPkgInfo = NULL;
947+
int nChecksumType = 0;
947948

948949
if(!ppPkgInfos)
949950
{
@@ -998,6 +999,34 @@ TDNFPopulatePkgInfos(
998999
&pPkgInfo->pszLocation);
9991000
BAIL_ON_TDNF_ERROR(dwError);
10001001

1002+
dwError = SolvGetPkgChecksumFromId(
1003+
pSack,
1004+
dwPkgId,
1005+
&nChecksumType,
1006+
&pPkgInfo->pbChecksum);
1007+
//Ignore no data
1008+
if(dwError == ERROR_TDNF_NO_DATA)
1009+
{
1010+
dwError = 0;
1011+
} else if (nChecksumType == REPOKEY_TYPE_SHA512)
1012+
{
1013+
pPkgInfo->nChecksumType = TDNF_HASH_SHA512;
1014+
} else if (nChecksumType == REPOKEY_TYPE_SHA256)
1015+
{
1016+
pPkgInfo->nChecksumType = TDNF_HASH_SHA256;
1017+
} else if (nChecksumType == REPOKEY_TYPE_SHA1)
1018+
{
1019+
pPkgInfo->nChecksumType = TDNF_HASH_SHA1;
1020+
} else if (nChecksumType == REPOKEY_TYPE_MD5)
1021+
{
1022+
pPkgInfo->nChecksumType = TDNF_HASH_MD5;
1023+
} else
1024+
{
1025+
pPkgInfo->pbChecksum = NULL;
1026+
}
1027+
1028+
BAIL_ON_TDNF_ERROR(dwError);
1029+
10011030
dwError = SolvGetPkgInstallSizeFromId(
10021031
pSack,
10031032
dwPkgId,

client/prototypes.h

+1-5
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,6 @@
2222
#define __CLIENT_PROTOTYPES_H__
2323

2424
#include <unistd.h>
25-
#include <openssl/sha.h>
26-
#include <openssl/md5.h>
27-
#include <openssl/evp.h>
2825

2926
extern uid_t gEuid;
3027

@@ -871,8 +868,7 @@ uint32_t
871868
TDNFTransAddInstallPkg(
872869
PTDNFRPMTS pTS,
873870
PTDNF pTdnf,
874-
const char* pszPackageLocation,
875-
const char* pszPkgName,
871+
PTDNF_PKG_INFO pInfo,
876872
PTDNF_REPO_DATA pRepo,
877873
int nUpgrade
878874
);

client/remoterepo.c

+7-2
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ TDNFDownloadFile(
163163
/* lStatus reads CURLINFO_RESPONSE_CODE. Must be long */
164164
long lStatus = 0;
165165
int i;
166+
int nNoOutput = 1;
166167

167168
/* TDNFFetchRemoteGPGKey sends pszProgressData as NULL */
168169
if(!pTdnf ||
@@ -215,6 +216,7 @@ TDNFDownloadFile(
215216
{
216217
dwError = set_progress_cb(pCurl, pszProgressData);
217218
BAIL_ON_TDNF_ERROR(dwError);
219+
nNoOutput = 0;
218220
}
219221
}
220222

@@ -253,6 +255,11 @@ TDNFDownloadFile(
253255
fclose(fp);
254256
fp = NULL;
255257
}
258+
/* finish progress line output,
259+
but only if progrees was enabled */
260+
if (!nNoOutput) {
261+
pr_info("\n");
262+
}
256263

257264
dwError = curl_easy_getinfo(pCurl,
258265
CURLINFO_RESPONSE_CODE,
@@ -405,8 +412,6 @@ TDNFDownloadPackage(
405412
}
406413
BAIL_ON_TDNF_ERROR(dwError);
407414

408-
pr_info("\n");
409-
410415
cleanup:
411416
TDNF_SAFE_FREE_MEMORY(pszCopyOfPackageLocation);
412417
TDNF_SAFE_FREE_MEMORY(pszPackageFile);

client/rpmtrans.c

+39-4
Original file line numberDiff line numberDiff line change
@@ -799,8 +799,7 @@ TDNFTransAddInstallPkgs(
799799
dwError = TDNFTransAddInstallPkg(
800800
pTS,
801801
pTdnf,
802-
pInfo->pszLocation,
803-
pInfo->pszName,
802+
pInfo,
804803
pRepo,
805804
nUpgrade);
806805
BAIL_ON_TDNF_ERROR(dwError);
@@ -821,8 +820,7 @@ uint32_t
821820
TDNFTransAddInstallPkg(
822821
PTDNFRPMTS pTS,
823822
PTDNF pTdnf,
824-
const char* pszPackageLocation,
825-
const char* pszPkgName,
823+
PTDNF_PKG_INFO pInfo,
826824
PTDNF_REPO_DATA pRepo,
827825
int nUpgrade
828826
)
@@ -832,6 +830,20 @@ TDNFTransAddInstallPkg(
832830
char* pszFilePath = NULL;
833831
Header rpmHeader = NULL;
834832
PTDNF_CACHED_RPM_ENTRY pRpmCache = NULL;
833+
const char* pszPackageLocation = NULL;
834+
const char* pszPkgName = NULL;
835+
uint8_t digest_from_file[EVP_MAX_MD_SIZE] = {0};
836+
hash_op *hash = NULL;
837+
int nSize;
838+
839+
if(!pTS || !pTdnf || !pInfo || !pRepo)
840+
{
841+
dwError = ERROR_TDNF_INVALID_PARAMETER;
842+
BAIL_ON_TDNF_ERROR(dwError);
843+
}
844+
845+
pszPackageLocation = pInfo->pszLocation;
846+
pszPkgName = pInfo->pszName;
835847

836848
if (pszPackageLocation[0] == '/')
837849
{
@@ -900,6 +912,29 @@ TDNFTransAddInstallPkg(
900912
BAIL_ON_TDNF_SYSTEM_ERROR(dwError);
901913
}
902914

915+
if(pInfo->pbChecksum != NULL) {
916+
hash = hash_ops + pInfo->nChecksumType;
917+
918+
dwError = TDNFGetDigestForFile(pszFilePath, hash, digest_from_file);
919+
BAIL_ON_TDNF_ERROR(dwError);
920+
921+
if (memcmp(digest_from_file, pInfo->pbChecksum, hash->length))
922+
{
923+
pr_err("rpm file (%s) Checksum FAILED (digest mismatch)\n", pszFilePath);
924+
dwError = ERROR_TDNF_CHECKSUM_MISMATCH;
925+
BAIL_ON_TDNF_ERROR(dwError);
926+
}
927+
}
928+
929+
dwError = TDNFGetFileSize(pszFilePath, &nSize);
930+
BAIL_ON_TDNF_ERROR(dwError);
931+
932+
if (nSize != (int)pInfo->dwDownloadSizeBytes) {
933+
pr_err("rpm file (%s) size (%u) does not match expected size (%u)\n", pszFilePath, nSize, pInfo->dwDownloadSizeBytes);
934+
dwError = ERROR_TDNF_SIZE_MISMATCH;
935+
BAIL_ON_TDNF_ERROR(dwError);
936+
}
937+
903938
dwError = TDNFGPGCheckPackage(pTS, pTdnf, pRepo, pszFilePath, &rpmHeader);
904939
BAIL_ON_TDNF_ERROR(dwError);
905940

common/prototypes.h

+33
Original file line numberDiff line numberDiff line change
@@ -324,4 +324,37 @@ tdnflockNewAcquire(
324324
const char *descr
325325
);
326326

327+
int32_t strtoi(const char *ptr);
328+
329+
uint32_t
330+
TDNFGetDigestForFile(
331+
const char *filename,
332+
hash_op *hash,
333+
uint8_t *digest
334+
);
335+
336+
uint32_t
337+
TDNFCheckHash(
338+
const char *filename,
339+
unsigned char *digest,
340+
int type
341+
);
342+
343+
uint32_t
344+
TDNFCheckHexDigest(
345+
const char *hex_digest,
346+
int digest_length
347+
);
348+
349+
uint32_t
350+
TDNFHexToUint(
351+
const char *hex_digest,
352+
unsigned char *uintValue
353+
);
354+
355+
uint32_t
356+
TDNFChecksumFromHexDigest(
357+
const char *hex_digest,
358+
unsigned char *ppdigest
359+
);
327360
#endif /* __COMMON_PROTOTYPES_H__ */

common/structs.h

+27
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
#pragma once
22

3+
#include <openssl/sha.h>
4+
#include <openssl/md5.h>
5+
#include <openssl/evp.h>
6+
37
typedef struct _KEYVALUE_
48
{
59
char *pszKey;
@@ -46,3 +50,26 @@ enum {
4650
TDNFLOCK_WRITE = 1 << 1,
4751
TDNFLOCK_WAIT = 1 << 2,
4852
};
53+
54+
// Enum in order of preference
55+
enum {
56+
TDNF_HASH_MD5 = 0,
57+
TDNF_HASH_SHA1,
58+
TDNF_HASH_SHA256,
59+
TDNF_HASH_SHA512,
60+
TDNF_HASH_SENTINEL
61+
};
62+
63+
typedef struct _hash_op {
64+
char *hash_type;
65+
unsigned int length;
66+
} hash_op;
67+
68+
typedef struct _hash_type {
69+
char *hash_name;
70+
unsigned int hash_value;
71+
}hash_type;
72+
73+
extern hash_op hash_ops[TDNF_HASH_SENTINEL];
74+
75+
extern hash_type hashType[7];

0 commit comments

Comments
 (0)