@@ -1234,6 +1234,16 @@ static void OSReleaseParse(EvalContext *ctx, const char *file_path)
1234
1234
JsonDestroy (os_release_json );
1235
1235
}
1236
1236
}
1237
+
1238
+ void OSReleasePut (EvalContext * ctx , const char * key , const char * value )
1239
+ {
1240
+ DataType type_out ;
1241
+ JsonElement * os_rel = EvalContextVariableGetSpecial (
1242
+ ctx , SPECIAL_SCOPE_SYS , "os_release" , & type_out );
1243
+
1244
+ JsonObjectAppendString (os_rel , key , value );
1245
+ }
1246
+
1237
1247
#endif
1238
1248
1239
1249
static void OSClasses (EvalContext * ctx )
@@ -2164,6 +2174,17 @@ static int Linux_Redhat_Version(EvalContext *ctx)
2164
2174
}
2165
2175
}
2166
2176
2177
+ // For CentOS 7, os-release VERSION_ID only show the major version.
2178
+ // This updates it with the version major.minor from redhat-release
2179
+ if (major != -1 && minor != -2 )
2180
+ {
2181
+ char version_id [CF_MAXVARSIZE ];
2182
+ strcat (version_id , strmajor );
2183
+ strcat (version_id , "." );
2184
+ strcat (version_id , strminor );
2185
+ OSReleasePut (ctx , "VERSION_ID" , version_id );
2186
+ }
2187
+
2167
2188
return 0 ;
2168
2189
}
2169
2190
@@ -3782,6 +3803,93 @@ static void SysOsVersionMajor(EvalContext *ctx)
3782
3803
free (flavor );
3783
3804
}
3784
3805
3806
+ /*****************************************************************************/
3807
+
3808
+ static const char * OSReleaseGet (EvalContext * ctx , const char * field )
3809
+ {
3810
+ DataType type_out ;
3811
+ const JsonElement * os_rel = EvalContextVariableGetSpecial (
3812
+ ctx , SPECIAL_SCOPE_SYS , "os_release" , & type_out );
3813
+
3814
+ if (type_out != CF_DATA_TYPE_CONTAINER )
3815
+ {
3816
+ return NULL ;
3817
+ }
3818
+ const JsonElement * child = JsonObjectGet (os_rel , field );
3819
+ if (child == NULL )
3820
+ {
3821
+ return NULL ;
3822
+ }
3823
+ const char * result = JsonPrimitiveGetAsString (child );
3824
+ return result ;
3825
+ }
3826
+
3827
+ static void OSVersionMinorPut (EvalContext * ctx , const char * minor )
3828
+ {
3829
+ EvalContextVariablePutSpecial (ctx , SPECIAL_SCOPE_SYS ,
3830
+ "os_version_minor" ,
3831
+ (minor == NULL ) ? "Unknown" : minor ,
3832
+ CF_DATA_TYPE_STRING ,
3833
+ "source=agent,derived-from=os_release" );
3834
+ }
3835
+
3836
+ static void SysOSVersionMinor (EvalContext * ctx )
3837
+ {
3838
+ #ifndef __MINGW32__
3839
+
3840
+ const char * version_id = OSReleaseGet (ctx , "VERSION_ID" );
3841
+ const char * name = OSReleaseGet (ctx , "NAME" );
3842
+ if ((version_id == NULL ) || (name == NULL ))
3843
+ {
3844
+ return OSVersionMinorPut (ctx , NULL );
3845
+ }
3846
+ Item * version_tuple = SplitString (version_id , '.' );
3847
+ if (version_tuple == NULL )
3848
+ {
3849
+ return OSVersionMinorPut (ctx , NULL );
3850
+ }
3851
+ if (StringStartsWith (name , "solaris" ) || StringStartsWith (name , "sunos" ))
3852
+ {
3853
+ OSVersionMinorPut (ctx , version_tuple -> name );
3854
+ return DeleteItemList (version_tuple );
3855
+ }
3856
+ if (version_tuple -> next == NULL )
3857
+ {
3858
+ OSVersionMinorPut (ctx , NULL );
3859
+ return DeleteItemList (version_tuple );
3860
+ }
3861
+ OSVersionMinorPut (ctx , version_tuple -> next -> name );
3862
+ return DeleteItemList (version_tuple );
3863
+
3864
+ #else
3865
+
3866
+ char * release = SafeStringDuplicate (VSYSNAME .release );
3867
+ char * major = NULL ;
3868
+ char * minor = NULL ;
3869
+ char * rel ;
3870
+ rel = FindNextInteger (release , & major );
3871
+ if (rel == NULL )
3872
+ {
3873
+ free (release );
3874
+ EvalContextVariablePutSpecial (ctx , SPECIAL_SCOPE_SYS ,
3875
+ "os_version_minor" ,
3876
+ "Unknown" ,
3877
+ CF_DATA_TYPE_STRING ,
3878
+ "source=agent" );
3879
+ return ;
3880
+ }
3881
+ rel = FindNextInteger (rel , & minor );
3882
+ EvalContextVariablePutSpecial (ctx , SPECIAL_SCOPE_SYS ,
3883
+ "os_version_minor" ,
3884
+ (minor == NULL ) ? "Unknown" : minor ,
3885
+ CF_DATA_TYPE_STRING ,
3886
+ "source=agent" );
3887
+ free (release );
3888
+
3889
+ #endif
3890
+ }
3891
+
3892
+
3785
3893
/*****************************************************************************/
3786
3894
3787
3895
void DetectEnvironment (EvalContext * ctx )
@@ -3796,4 +3904,5 @@ void DetectEnvironment(EvalContext *ctx)
3796
3904
GetDefVars (ctx );
3797
3905
SysOSNameHuman (ctx );
3798
3906
SysOsVersionMajor (ctx );
3907
+ SysOSVersionMinor (ctx );
3799
3908
}
0 commit comments