diff --git a/catalog/systemd.catalog.in b/catalog/systemd.catalog.in
index db275d7c5..3342d5942 100644
--- a/catalog/systemd.catalog.in
+++ b/catalog/systemd.catalog.in
@@ -412,3 +412,26 @@ as the best process to terminate and has been forcibly terminated by the
kernel.
Note that the memory pressure might or might not have been caused by @UNIT@.
+
+-- b61fdac612e94b9182285b998843061f
+Subject: Accepting user/group name @USER_GROUP_NAME@, which does not match strict user/group name rules.
+Defined-By: systemd
+Support: %SUPPORT_URL%
+
+The user/group name @USER_GROUP_NAME@ has been specified, which is accepted
+according the relaxed user/group name rules, but does not qualify under the
+strict rules.
+
+The strict user/group name rules written as regular expression are:
+
+^[a-zA-Z_][a-zA-Z0-9_-]{0,30}$
+
+The relaxed user/group name rules accept all names, except for the empty
+string; names containing NUL bytes, control characters, colon or slash
+characters; names not valid UTF-8; names with leading or trailing whitespace;
+the strings "." or ".."; fully numeric strings, or strings beginning in a
+hyphen and otherwise fully numeric.
+
+For further details on strict and relaxed user/group name rules, see:
+
+https://systemd.io/USER_NAMES
diff --git a/docs/USER_RECORD.md b/docs/USER_RECORD.md
index 299aaade4..448631bc8 100644
--- a/docs/USER_RECORD.md
+++ b/docs/USER_RECORD.md
@@ -205,7 +205,8 @@ object. The following fields are currently defined:
UNIX user name. This field is the only mandatory field, all others are
optional. Corresponds with the `pw_name` field of of `struct passwd` and the
`sp_namp` field of `struct spwd` (i.e. the shadow user record stored in
-`/etc/shadow`).
+`/etc/shadow`). See [User/Group Name Syntax](https://systemd.io/USER_NAMES) for
+the (relaxed) rules the various systemd components enforce on user/group names.
`realm` → The "realm" a user is defined in. This concept allows distinguishing
users with the same name that originate in different organizations or
diff --git a/hwdb.d/20-bluetooth-vendor-product.hwdb b/hwdb.d/20-bluetooth-vendor-product.hwdb
index 9cba3bfc0..1d92f57ec 100644
--- a/hwdb.d/20-bluetooth-vendor-product.hwdb
+++ b/hwdb.d/20-bluetooth-vendor-product.hwdb
@@ -46,7 +46,7 @@ bluetooth:v000D*
ID_VENDOR_FROM_DATABASE=Texas Instruments Inc.
bluetooth:v000E*
- ID_VENDOR_FROM_DATABASE=Ceva, Inc. (formerly Parthus Technologies, Inc.)
+ ID_VENDOR_FROM_DATABASE=Parthus Technologies Inc.
bluetooth:v000F*
ID_VENDOR_FROM_DATABASE=Broadcom Corporation
@@ -55,7 +55,7 @@ bluetooth:v0010*
ID_VENDOR_FROM_DATABASE=Mitel Semiconductor
bluetooth:v0011*
- ID_VENDOR_FROM_DATABASE=Widcomm, Inc
+ ID_VENDOR_FROM_DATABASE=Widcomm, Inc.
bluetooth:v0012*
ID_VENDOR_FROM_DATABASE=Zeevo, Inc.
@@ -73,7 +73,7 @@ bluetooth:v0016*
ID_VENDOR_FROM_DATABASE=KC Technology Inc.
bluetooth:v0017*
- ID_VENDOR_FROM_DATABASE=NewLogic
+ ID_VENDOR_FROM_DATABASE=Newlogic
bluetooth:v0018*
ID_VENDOR_FROM_DATABASE=Transilica, Inc.
@@ -172,13 +172,13 @@ bluetooth:v0037*
ID_VENDOR_FROM_DATABASE=Mobilian Corporation
bluetooth:v0038*
- ID_VENDOR_FROM_DATABASE=Terax
+ ID_VENDOR_FROM_DATABASE=Syntronix Corporation
bluetooth:v0039*
ID_VENDOR_FROM_DATABASE=Integrated System Solution Corp.
bluetooth:v003A*
- ID_VENDOR_FROM_DATABASE=Matsushita Electric Industrial Co., Ltd.
+ ID_VENDOR_FROM_DATABASE=Panasonic Corporation (formerly Matsushita Electric Industrial Co., Ltd.)
bluetooth:v003B*
ID_VENDOR_FROM_DATABASE=Gennum Corporation
@@ -190,10 +190,10 @@ bluetooth:v003D*
ID_VENDOR_FROM_DATABASE=IPextreme, Inc.
bluetooth:v003E*
- ID_VENDOR_FROM_DATABASE=Systems and Chips, Inc.
+ ID_VENDOR_FROM_DATABASE=Systems and Chips, Inc
bluetooth:v003F*
- ID_VENDOR_FROM_DATABASE=Bluetooth SIG, Inc.
+ ID_VENDOR_FROM_DATABASE=Bluetooth SIG, Inc
bluetooth:v0040*
ID_VENDOR_FROM_DATABASE=Seiko Epson Corporation
@@ -205,7 +205,7 @@ bluetooth:v0042*
ID_VENDOR_FROM_DATABASE=CONWISE Technology Corporation Ltd
bluetooth:v0043*
- ID_VENDOR_FROM_DATABASE=PARROT SA
+ ID_VENDOR_FROM_DATABASE=PARROT AUTOMOTIVE SAS
bluetooth:v0044*
ID_VENDOR_FROM_DATABASE=Socket Mobile
@@ -241,10 +241,10 @@ bluetooth:v004E*
ID_VENDOR_FROM_DATABASE=Avago Technologies
bluetooth:v004F*
- ID_VENDOR_FROM_DATABASE=APT Licensing Ltd.
+ ID_VENDOR_FROM_DATABASE=APT Ltd.
bluetooth:v0050*
- ID_VENDOR_FROM_DATABASE=SiRF Technology
+ ID_VENDOR_FROM_DATABASE=SiRF Technology, Inc.
bluetooth:v0051*
ID_VENDOR_FROM_DATABASE=Tzero Technologies, Inc.
@@ -331,7 +331,7 @@ bluetooth:v006C*
ID_VENDOR_FROM_DATABASE=Beautiful Enterprise Co., Ltd.
bluetooth:v006D*
- ID_VENDOR_FROM_DATABASE=BriarTek, Inc.
+ ID_VENDOR_FROM_DATABASE=BriarTek, Inc
bluetooth:v006E*
ID_VENDOR_FROM_DATABASE=Summit Data Communications, Inc.
@@ -382,7 +382,7 @@ bluetooth:v007C*
ID_VENDOR_FROM_DATABASE=A & R Cambridge
bluetooth:v007D*
- ID_VENDOR_FROM_DATABASE=Seers Technology Co. Ltd
+ ID_VENDOR_FROM_DATABASE=Seers Technology Co., Ltd.
bluetooth:v007E*
ID_VENDOR_FROM_DATABASE=Sports Tracking Technologies Ltd.
@@ -409,7 +409,7 @@ bluetooth:v0085*
ID_VENDOR_FROM_DATABASE=BlueRadios, Inc.
bluetooth:v0086*
- ID_VENDOR_FROM_DATABASE=equinox AG
+ ID_VENDOR_FROM_DATABASE=Equinux AG
bluetooth:v0087*
ID_VENDOR_FROM_DATABASE=Garmin International, Inc.
@@ -433,16 +433,16 @@ bluetooth:v008D*
ID_VENDOR_FROM_DATABASE=Zscan Software
bluetooth:v008E*
- ID_VENDOR_FROM_DATABASE=Quintic Corp.
+ ID_VENDOR_FROM_DATABASE=Quintic Corp
bluetooth:v008F*
- ID_VENDOR_FROM_DATABASE=Telit Wireless Solutions GmbH (Formerly Stollman E+V GmbH)
+ ID_VENDOR_FROM_DATABASE=Telit Wireless Solutions GmbH (formerly Stollmann E+V GmbH)
bluetooth:v0090*
ID_VENDOR_FROM_DATABASE=Funai Electric Co., Ltd.
bluetooth:v0091*
- ID_VENDOR_FROM_DATABASE=Advanced PANMOBIL Systems GmbH & Co. KG
+ ID_VENDOR_FROM_DATABASE=Advanced PANMOBIL systems GmbH & Co. KG
bluetooth:v0092*
ID_VENDOR_FROM_DATABASE=ThinkOptics, Inc.
@@ -462,8 +462,11 @@ bluetooth:v0096*
bluetooth:v0097*
ID_VENDOR_FROM_DATABASE=ConnecteDevice Ltd.
+bluetooth:v0097p0002*
+ ID_PRODUCT_FROM_DATABASE=COOKOO watch
+
bluetooth:v0098*
- ID_VENDOR_FROM_DATABASE=zer01.tv GmbH
+ ID_VENDOR_FROM_DATABASE=zero1.tv GmbH
bluetooth:v0099*
ID_VENDOR_FROM_DATABASE=i.Tech Dynamic Global Distribution Ltd.
@@ -514,7 +517,7 @@ bluetooth:v00A8*
ID_VENDOR_FROM_DATABASE=ARP Devices Limited
bluetooth:v00A9*
- ID_VENDOR_FROM_DATABASE=Magneti Marelli S.p.A
+ ID_VENDOR_FROM_DATABASE=MARELLI EUROPE S.P.A. (formerly Magneti Marelli S.p.A.)
bluetooth:v00AA*
ID_VENDOR_FROM_DATABASE=CAEN RFID srl
@@ -712,7 +715,7 @@ bluetooth:v00EA*
ID_VENDOR_FROM_DATABASE=Nielsen-Kellerman Company
bluetooth:v00EB*
- ID_VENDOR_FROM_DATABASE=Server Technology, Inc.
+ ID_VENDOR_FROM_DATABASE=Server Technology Inc.
bluetooth:v00EC*
ID_VENDOR_FROM_DATABASE=BioResearch Associates
@@ -733,7 +736,7 @@ bluetooth:v00F1*
ID_VENDOR_FROM_DATABASE=Witron Technology Limited
bluetooth:v00F2*
- ID_VENDOR_FROM_DATABASE=Aether Things Inc. (formerly Morse Project Inc.)
+ ID_VENDOR_FROM_DATABASE=Morse Project Inc.
bluetooth:v00F3*
ID_VENDOR_FROM_DATABASE=Kent Displays Inc.
@@ -748,7 +751,7 @@ bluetooth:v00F6*
ID_VENDOR_FROM_DATABASE=Elcometer Limited
bluetooth:v00F7*
- ID_VENDOR_FROM_DATABASE=VSN Technologies Inc.
+ ID_VENDOR_FROM_DATABASE=VSN Technologies, Inc.
bluetooth:v00F8*
ID_VENDOR_FROM_DATABASE=AceUni Corp., Ltd.
@@ -769,7 +772,7 @@ bluetooth:v00FD*
ID_VENDOR_FROM_DATABASE=ValenceTech Limited
bluetooth:v00FE*
- ID_VENDOR_FROM_DATABASE=Reserved
+ ID_VENDOR_FROM_DATABASE=Stanley Black and Decker
bluetooth:v00FF*
ID_VENDOR_FROM_DATABASE=Typo Products, LLC
@@ -778,7 +781,7 @@ bluetooth:v0100*
ID_VENDOR_FROM_DATABASE=TomTom International BV
bluetooth:v0101*
- ID_VENDOR_FROM_DATABASE=Fugoo, Inc
+ ID_VENDOR_FROM_DATABASE=Fugoo, Inc.
bluetooth:v0102*
ID_VENDOR_FROM_DATABASE=Keiser Corporation
@@ -787,7 +790,7 @@ bluetooth:v0103*
ID_VENDOR_FROM_DATABASE=Bang & Olufsen A/S
bluetooth:v0104*
- ID_VENDOR_FROM_DATABASE=PLUS Locations Systems Pty Ltd
+ ID_VENDOR_FROM_DATABASE=PLUS Location Systems Pty Ltd
bluetooth:v0105*
ID_VENDOR_FROM_DATABASE=Ubiquitous Computing Technology Corporation
@@ -805,22 +808,22 @@ bluetooth:v0109*
ID_VENDOR_FROM_DATABASE=Atus BV
bluetooth:v010A*
- ID_VENDOR_FROM_DATABASE=Codegate Ltd.
+ ID_VENDOR_FROM_DATABASE=Codegate Ltd
bluetooth:v010B*
- ID_VENDOR_FROM_DATABASE=ERi, Inc.
+ ID_VENDOR_FROM_DATABASE=ERi, Inc
bluetooth:v010C*
ID_VENDOR_FROM_DATABASE=Transducers Direct, LLC
bluetooth:v010D*
- ID_VENDOR_FROM_DATABASE=Fujitsu Ten Limited
+ ID_VENDOR_FROM_DATABASE=DENSO TEN LIMITED (formerly Fujitsu Ten LImited)
bluetooth:v010E*
ID_VENDOR_FROM_DATABASE=Audi AG
bluetooth:v010F*
- ID_VENDOR_FROM_DATABASE=HiSilicon Technologies Co., Ltd.
+ ID_VENDOR_FROM_DATABASE=HiSilicon Technologies CO., LIMITED
bluetooth:v0110*
ID_VENDOR_FROM_DATABASE=Nippon Seiki Co., Ltd.
@@ -841,7 +844,7 @@ bluetooth:v0115*
ID_VENDOR_FROM_DATABASE=e.solutions
bluetooth:v0116*
- ID_VENDOR_FROM_DATABASE=1OAK Technologies
+ ID_VENDOR_FROM_DATABASE=10AK Technologies
bluetooth:v0117*
ID_VENDOR_FROM_DATABASE=Wimoto Technologies Inc
@@ -880,7 +883,7 @@ bluetooth:v0122*
ID_VENDOR_FROM_DATABASE=AirTurn, Inc.
bluetooth:v0123*
- ID_VENDOR_FROM_DATABASE=Kinsa, Inc.
+ ID_VENDOR_FROM_DATABASE=Kinsa, Inc
bluetooth:v0124*
ID_VENDOR_FROM_DATABASE=HID Global
@@ -901,7 +904,7 @@ bluetooth:v0129*
ID_VENDOR_FROM_DATABASE=Nimble Devices Oy
bluetooth:v012A*
- ID_VENDOR_FROM_DATABASE=Changzhou Yongse Infotech Co., Ltd
+ ID_VENDOR_FROM_DATABASE=Changzhou Yongse Infotech Co., Ltd.
bluetooth:v012B*
ID_VENDOR_FROM_DATABASE=SportIQ
@@ -916,13 +919,13 @@ bluetooth:v012E*
ID_VENDOR_FROM_DATABASE=ASSA ABLOY
bluetooth:v012F*
- ID_VENDOR_FROM_DATABASE=Clarion Co., Ltd.
+ ID_VENDOR_FROM_DATABASE=Clarion Co. Inc.
bluetooth:v0130*
ID_VENDOR_FROM_DATABASE=Warehouse Innovations
bluetooth:v0131*
- ID_VENDOR_FROM_DATABASE=Cypress Semiconductor Corporation
+ ID_VENDOR_FROM_DATABASE=Cypress Semiconductor
bluetooth:v0132*
ID_VENDOR_FROM_DATABASE=MADS Inc
@@ -931,13 +934,13 @@ bluetooth:v0133*
ID_VENDOR_FROM_DATABASE=Blue Maestro Limited
bluetooth:v0134*
- ID_VENDOR_FROM_DATABASE=Resolution Products, Inc.
+ ID_VENDOR_FROM_DATABASE=Resolution Products, Ltd.
bluetooth:v0135*
- ID_VENDOR_FROM_DATABASE=Airewear LLC
+ ID_VENDOR_FROM_DATABASE=Aireware LLC
bluetooth:v0136*
- ID_VENDOR_FROM_DATABASE=Seed Labs, Inc. (formerly ETC sp. z.o.o.)
+ ID_VENDOR_FROM_DATABASE=Silvair, Inc.
bluetooth:v0137*
ID_VENDOR_FROM_DATABASE=Prestigio Plaza Ltd.
@@ -949,13 +952,13 @@ bluetooth:v0139*
ID_VENDOR_FROM_DATABASE=Focus Systems Corporation
bluetooth:v013A*
- ID_VENDOR_FROM_DATABASE=Tencent Holdings Limited
+ ID_VENDOR_FROM_DATABASE=Tencent Holdings Ltd.
bluetooth:v013B*
ID_VENDOR_FROM_DATABASE=Allegion
bluetooth:v013C*
- ID_VENDOR_FROM_DATABASE=Murata Manufacuring Co., Ltd.
+ ID_VENDOR_FROM_DATABASE=Murata Manufacturing Co., Ltd.
bluetooth:v013D*
ID_VENDOR_FROM_DATABASE=WirelessWERX
@@ -1006,7 +1009,7 @@ bluetooth:v014C*
ID_VENDOR_FROM_DATABASE=Mesh-Net Ltd
bluetooth:v014D*
- ID_VENDOR_FROM_DATABASE=Huizhou Desay SV Automotive CO., LTD.
+ ID_VENDOR_FROM_DATABASE=HUIZHOU DESAY SV AUTOMOTIVE CO., LTD.
bluetooth:v014E*
ID_VENDOR_FROM_DATABASE=Tangerine, Inc.
@@ -1069,7 +1072,7 @@ bluetooth:v0161*
ID_VENDOR_FROM_DATABASE=yikes
bluetooth:v0162*
- ID_VENDOR_FROM_DATABASE=MADSGlobal NZ Ltd.
+ ID_VENDOR_FROM_DATABASE=MADSGlobalNZ Ltd.
bluetooth:v0163*
ID_VENDOR_FROM_DATABASE=PCH International
@@ -1078,13 +1081,13 @@ bluetooth:v0164*
ID_VENDOR_FROM_DATABASE=Qingdao Yeelink Information Technology Co., Ltd.
bluetooth:v0165*
- ID_VENDOR_FROM_DATABASE=Milwaukee Tool (formerly Milwaukee Electric Tools)
+ ID_VENDOR_FROM_DATABASE=Milwaukee Tool (Formally Milwaukee Electric Tools)
bluetooth:v0166*
ID_VENDOR_FROM_DATABASE=MISHIK Pte Ltd
bluetooth:v0167*
- ID_VENDOR_FROM_DATABASE=Bayer HealthCare
+ ID_VENDOR_FROM_DATABASE=Ascensia Diabetes Care US Inc.
bluetooth:v0168*
ID_VENDOR_FROM_DATABASE=Spicebox LLC
@@ -1111,7 +1114,7 @@ bluetooth:v016F*
ID_VENDOR_FROM_DATABASE=Podo Labs, Inc
bluetooth:v0170*
- ID_VENDOR_FROM_DATABASE=F. Hoffmann-La Roche AG
+ ID_VENDOR_FROM_DATABASE=Roche Diabetes Care AG
bluetooth:v0171*
ID_VENDOR_FROM_DATABASE=Amazon Fulfillment Service
@@ -1123,7 +1126,7 @@ bluetooth:v0173*
ID_VENDOR_FROM_DATABASE=Kocomojo, LLC
bluetooth:v0174*
- ID_VENDOR_FROM_DATABASE=Everykey LLC
+ ID_VENDOR_FROM_DATABASE=Everykey Inc.
bluetooth:v0175*
ID_VENDOR_FROM_DATABASE=Dynamic Controls
@@ -1156,7 +1159,7 @@ bluetooth:v017E*
ID_VENDOR_FROM_DATABASE=BluDotz Ltd
bluetooth:v017F*
- ID_VENDOR_FROM_DATABASE=XTel ApS
+ ID_VENDOR_FROM_DATABASE=XTel Wireless ApS
bluetooth:v0180*
ID_VENDOR_FROM_DATABASE=Gigaset Communications GmbH
@@ -1168,7 +1171,7 @@ bluetooth:v0182*
ID_VENDOR_FROM_DATABASE=HOP Ubiquitous
bluetooth:v0183*
- ID_VENDOR_FROM_DATABASE=To Be Assigned
+ ID_VENDOR_FROM_DATABASE=Walt Disney
bluetooth:v0184*
ID_VENDOR_FROM_DATABASE=Nectar
@@ -1228,10 +1231,10 @@ bluetooth:v0196*
ID_VENDOR_FROM_DATABASE=Paxton Access Ltd
bluetooth:v0197*
- ID_VENDOR_FROM_DATABASE=WiSilica Inc
+ ID_VENDOR_FROM_DATABASE=WiSilica Inc.
bluetooth:v0198*
- ID_VENDOR_FROM_DATABASE=VENGIT Korlátolt Felelősségű Társaság
+ ID_VENDOR_FROM_DATABASE=VENGIT Korlatolt Felelossegu Tarsasag
bluetooth:v0199*
ID_VENDOR_FROM_DATABASE=SALTO SYSTEMS S.L.
@@ -1273,7 +1276,7 @@ bluetooth:v01A5*
ID_VENDOR_FROM_DATABASE=Icon Health and Fitness
bluetooth:v01A6*
- ID_VENDOR_FROM_DATABASE=Asandoo GmbH
+ ID_VENDOR_FROM_DATABASE=Wille Engineering (formely as Asandoo GmbH)
bluetooth:v01A7*
ID_VENDOR_FROM_DATABASE=ENERGOUS CORPORATION
@@ -1291,7 +1294,7 @@ bluetooth:v01AB*
ID_VENDOR_FROM_DATABASE=Facebook, Inc.
bluetooth:v01AC*
- ID_VENDOR_FROM_DATABASE=Nipro Diagnostics, Inc.
+ ID_VENDOR_FROM_DATABASE=Trividia Health, Inc.
bluetooth:v01AD*
ID_VENDOR_FROM_DATABASE=FlightSafety International
@@ -1402,7 +1405,7 @@ bluetooth:v01D0*
ID_VENDOR_FROM_DATABASE=Primus Inter Pares Ltd
bluetooth:v01D1*
- ID_VENDOR_FROM_DATABASE=August
+ ID_VENDOR_FROM_DATABASE=August Home, Inc
bluetooth:v01D2*
ID_VENDOR_FROM_DATABASE=Gill Electronics
@@ -1474,7 +1477,7 @@ bluetooth:v01E8*
ID_VENDOR_FROM_DATABASE=STIR
bluetooth:v01E9*
- ID_VENDOR_FROM_DATABASE=Sano, Inc
+ ID_VENDOR_FROM_DATABASE=Sano, Inc.
bluetooth:v01EA*
ID_VENDOR_FROM_DATABASE=Advanced Application Design, Inc.
@@ -1522,10 +1525,10 @@ bluetooth:v01F8*
ID_VENDOR_FROM_DATABASE=Anyka (Guangzhou) Microelectronics Technology Co, LTD
bluetooth:v01F9*
- ID_VENDOR_FROM_DATABASE=Medtronic, Inc.
+ ID_VENDOR_FROM_DATABASE=Medtronic Inc.
bluetooth:v01FA*
- ID_VENDOR_FROM_DATABASE=Gozio, Inc.
+ ID_VENDOR_FROM_DATABASE=Gozio Inc.
bluetooth:v01FB*
ID_VENDOR_FROM_DATABASE=Form Lifting, LLC
@@ -1537,13 +1540,13 @@ bluetooth:v01FD*
ID_VENDOR_FROM_DATABASE=Kontakt Micro-Location Sp. z o.o.
bluetooth:v01FE*
- ID_VENDOR_FROM_DATABASE=Radio System Corporation
+ ID_VENDOR_FROM_DATABASE=Radio Systems Corporation
bluetooth:v01FF*
ID_VENDOR_FROM_DATABASE=Freescale Semiconductor, Inc.
bluetooth:v0200*
- ID_VENDOR_FROM_DATABASE=Verifone Systems PTe Ltd. Taiwan Branch
+ ID_VENDOR_FROM_DATABASE=Verifone Systems Pte Ltd. Taiwan Branch
bluetooth:v0201*
ID_VENDOR_FROM_DATABASE=AR Timing
@@ -1624,7 +1627,7 @@ bluetooth:v021A*
ID_VENDOR_FROM_DATABASE=Blue Speck Labs, LLC
bluetooth:v021B*
- ID_VENDOR_FROM_DATABASE=Cisco Systems Inc
+ ID_VENDOR_FROM_DATABASE=Cisco Systems, Inc
bluetooth:v021C*
ID_VENDOR_FROM_DATABASE=Mobicomm Inc
@@ -1633,10 +1636,10 @@ bluetooth:v021D*
ID_VENDOR_FROM_DATABASE=Edamic
bluetooth:v021E*
- ID_VENDOR_FROM_DATABASE=Goodnet Ltd
+ ID_VENDOR_FROM_DATABASE=Goodnet, Ltd
bluetooth:v021F*
- ID_VENDOR_FROM_DATABASE=Luster Leaf Products Inc
+ ID_VENDOR_FROM_DATABASE=Luster Leaf Products Inc
bluetooth:v0220*
ID_VENDOR_FROM_DATABASE=Manus Machina BV
@@ -1717,7 +1720,7 @@ bluetooth:v0239*
ID_VENDOR_FROM_DATABASE=JIN CO, Ltd
bluetooth:v023A*
- ID_VENDOR_FROM_DATABASE=Alatech Technology
+ ID_VENDOR_FROM_DATABASE=Alatech Tehnology
bluetooth:v023B*
ID_VENDOR_FROM_DATABASE=Beijing CarePulse Electronic Technology Co, Ltd
@@ -1732,7 +1735,7 @@ bluetooth:v023E*
ID_VENDOR_FROM_DATABASE=Raven Industries
bluetooth:v023F*
- ID_VENDOR_FROM_DATABASE=WaveWare Technologies
+ ID_VENDOR_FROM_DATABASE=WaveWare Technologies Inc.
bluetooth:v0240*
ID_VENDOR_FROM_DATABASE=Argenox Technologies
@@ -1747,10 +1750,10 @@ bluetooth:v0243*
ID_VENDOR_FROM_DATABASE=Masimo Corp
bluetooth:v0244*
- ID_VENDOR_FROM_DATABASE=Iotera Inc.
+ ID_VENDOR_FROM_DATABASE=Iotera Inc
bluetooth:v0245*
- ID_VENDOR_FROM_DATABASE=Endress+Hauser
+ ID_VENDOR_FROM_DATABASE=Endress+Hauser
bluetooth:v0246*
ID_VENDOR_FROM_DATABASE=ACKme Networks, Inc.
@@ -1819,7 +1822,7 @@ bluetooth:v025B*
ID_VENDOR_FROM_DATABASE=Five Interactive, LLC dba Zendo
bluetooth:v025C*
- ID_VENDOR_FROM_DATABASE=NetEase (Hangzhou) Network co.Ltd.
+ ID_VENDOR_FROM_DATABASE=NetEase(Hangzhou)Network co.Ltd.
bluetooth:v025D*
ID_VENDOR_FROM_DATABASE=Lexmark International Inc.
@@ -1897,7 +1900,7 @@ bluetooth:v0275*
ID_VENDOR_FROM_DATABASE=Geotab
bluetooth:v0276*
- ID_VENDOR_FROM_DATABASE=E.G.O. Elektro-Gerätebau GmbH
+ ID_VENDOR_FROM_DATABASE=E.G.O. Elektro-Geraetebau GmbH
bluetooth:v0277*
ID_VENDOR_FROM_DATABASE=bewhere inc
@@ -1918,7 +1921,7 @@ bluetooth:v027C*
ID_VENDOR_FROM_DATABASE=Aseptika Ltd
bluetooth:v027D*
- ID_VENDOR_FROM_DATABASE=HUAWEI Technologies Co., Ltd. ( 华为技术有限公司 )
+ ID_VENDOR_FROM_DATABASE=HUAWEI Technologies Co., Ltd.
bluetooth:v027E*
ID_VENDOR_FROM_DATABASE=HabitAware, LLC
@@ -2323,7 +2326,7 @@ bluetooth:v0303*
ID_VENDOR_FROM_DATABASE=IACA electronique
bluetooth:v0304*
- ID_VENDOR_FROM_DATABASE=Martians Inc
+ ID_VENDOR_FROM_DATABASE=Proxy Technologies, Inc.
bluetooth:v0305*
ID_VENDOR_FROM_DATABASE=Swipp ApS
@@ -3082,7 +3085,7 @@ bluetooth:v0400*
ID_VENDOR_FROM_DATABASE=i-developer IT Beratung UG
bluetooth:v0401*
- ID_VENDOR_FROM_DATABASE=リレーションズ株式会社
+ ID_VENDOR_FROM_DATABASE=Relations Inc.
bluetooth:v0402*
ID_VENDOR_FROM_DATABASE=Sears Holdings Corporation
@@ -3119,3 +3122,3555 @@ bluetooth:v040C*
bluetooth:v040D*
ID_VENDOR_FROM_DATABASE=NorthStar Battery Company, LLC
+
+bluetooth:v040E*
+ ID_VENDOR_FROM_DATABASE=SKF (U.K.) Limited
+
+bluetooth:v040F*
+ ID_VENDOR_FROM_DATABASE=CO-AX Technology, Inc.
+
+bluetooth:v0410*
+ ID_VENDOR_FROM_DATABASE=Fender Musical Instruments
+
+bluetooth:v0411*
+ ID_VENDOR_FROM_DATABASE=Luidia Inc
+
+bluetooth:v0412*
+ ID_VENDOR_FROM_DATABASE=SEFAM
+
+bluetooth:v0413*
+ ID_VENDOR_FROM_DATABASE=Wireless Cables Inc
+
+bluetooth:v0414*
+ ID_VENDOR_FROM_DATABASE=Lightning Protection International Pty Ltd
+
+bluetooth:v0415*
+ ID_VENDOR_FROM_DATABASE=Uber Technologies Inc
+
+bluetooth:v0416*
+ ID_VENDOR_FROM_DATABASE=SODA GmbH
+
+bluetooth:v0417*
+ ID_VENDOR_FROM_DATABASE=Fatigue Science
+
+bluetooth:v0418*
+ ID_VENDOR_FROM_DATABASE=Alpine Electronics Inc.
+
+bluetooth:v0419*
+ ID_VENDOR_FROM_DATABASE=Novalogy LTD
+
+bluetooth:v041A*
+ ID_VENDOR_FROM_DATABASE=Friday Labs Limited
+
+bluetooth:v041B*
+ ID_VENDOR_FROM_DATABASE=OrthoAccel Technologies
+
+bluetooth:v041C*
+ ID_VENDOR_FROM_DATABASE=WaterGuru, Inc.
+
+bluetooth:v041D*
+ ID_VENDOR_FROM_DATABASE=Benning Elektrotechnik und Elektronik GmbH & Co. KG
+
+bluetooth:v041E*
+ ID_VENDOR_FROM_DATABASE=Dell Computer Corporation
+
+bluetooth:v041F*
+ ID_VENDOR_FROM_DATABASE=Kopin Corporation
+
+bluetooth:v0420*
+ ID_VENDOR_FROM_DATABASE=TecBakery GmbH
+
+bluetooth:v0421*
+ ID_VENDOR_FROM_DATABASE=Backbone Labs, Inc.
+
+bluetooth:v0422*
+ ID_VENDOR_FROM_DATABASE=DELSEY SA
+
+bluetooth:v0423*
+ ID_VENDOR_FROM_DATABASE=Chargifi Limited
+
+bluetooth:v0424*
+ ID_VENDOR_FROM_DATABASE=Trainesense Ltd.
+
+bluetooth:v0425*
+ ID_VENDOR_FROM_DATABASE=Unify Software and Solutions GmbH & Co. KG
+
+bluetooth:v0426*
+ ID_VENDOR_FROM_DATABASE=Husqvarna AB
+
+bluetooth:v0427*
+ ID_VENDOR_FROM_DATABASE=Focus fleet and fuel management inc
+
+bluetooth:v0428*
+ ID_VENDOR_FROM_DATABASE=SmallLoop, LLC
+
+bluetooth:v0429*
+ ID_VENDOR_FROM_DATABASE=Prolon Inc.
+
+bluetooth:v042A*
+ ID_VENDOR_FROM_DATABASE=BD Medical
+
+bluetooth:v042B*
+ ID_VENDOR_FROM_DATABASE=iMicroMed Incorporated
+
+bluetooth:v042C*
+ ID_VENDOR_FROM_DATABASE=Ticto N.V.
+
+bluetooth:v042D*
+ ID_VENDOR_FROM_DATABASE=Meshtech AS
+
+bluetooth:v042E*
+ ID_VENDOR_FROM_DATABASE=MemCachier Inc.
+
+bluetooth:v042F*
+ ID_VENDOR_FROM_DATABASE=Danfoss A/S
+
+bluetooth:v0430*
+ ID_VENDOR_FROM_DATABASE=SnapStyk Inc.
+
+bluetooth:v0431*
+ ID_VENDOR_FROM_DATABASE=Amway Corporation
+
+bluetooth:v0432*
+ ID_VENDOR_FROM_DATABASE=Silk Labs, Inc.
+
+bluetooth:v0433*
+ ID_VENDOR_FROM_DATABASE=Pillsy Inc.
+
+bluetooth:v0434*
+ ID_VENDOR_FROM_DATABASE=Hatch Baby, Inc.
+
+bluetooth:v0435*
+ ID_VENDOR_FROM_DATABASE=Blocks Wearables Ltd.
+
+bluetooth:v0436*
+ ID_VENDOR_FROM_DATABASE=Drayson Technologies (Europe) Limited
+
+bluetooth:v0437*
+ ID_VENDOR_FROM_DATABASE=eBest IOT Inc.
+
+bluetooth:v0438*
+ ID_VENDOR_FROM_DATABASE=Helvar Ltd
+
+bluetooth:v0439*
+ ID_VENDOR_FROM_DATABASE=Radiance Technologies
+
+bluetooth:v043A*
+ ID_VENDOR_FROM_DATABASE=Nuheara Limited
+
+bluetooth:v043B*
+ ID_VENDOR_FROM_DATABASE=Appside co., ltd.
+
+bluetooth:v043C*
+ ID_VENDOR_FROM_DATABASE=DeLaval
+
+bluetooth:v043D*
+ ID_VENDOR_FROM_DATABASE=Coiler Corporation
+
+bluetooth:v043E*
+ ID_VENDOR_FROM_DATABASE=Thermomedics, Inc.
+
+bluetooth:v043F*
+ ID_VENDOR_FROM_DATABASE=Tentacle Sync GmbH
+
+bluetooth:v0440*
+ ID_VENDOR_FROM_DATABASE=Valencell, Inc.
+
+bluetooth:v0441*
+ ID_VENDOR_FROM_DATABASE=iProtoXi Oy
+
+bluetooth:v0442*
+ ID_VENDOR_FROM_DATABASE=SECOM CO., LTD.
+
+bluetooth:v0443*
+ ID_VENDOR_FROM_DATABASE=Tucker International LLC
+
+bluetooth:v0444*
+ ID_VENDOR_FROM_DATABASE=Metanate Limited
+
+bluetooth:v0445*
+ ID_VENDOR_FROM_DATABASE=Kobian Canada Inc.
+
+bluetooth:v0446*
+ ID_VENDOR_FROM_DATABASE=NETGEAR, Inc.
+
+bluetooth:v0447*
+ ID_VENDOR_FROM_DATABASE=Fabtronics Australia Pty Ltd
+
+bluetooth:v0448*
+ ID_VENDOR_FROM_DATABASE=Grand Centrix GmbH
+
+bluetooth:v0449*
+ ID_VENDOR_FROM_DATABASE=1UP USA.com llc
+
+bluetooth:v044A*
+ ID_VENDOR_FROM_DATABASE=SHIMANO INC.
+
+bluetooth:v044B*
+ ID_VENDOR_FROM_DATABASE=Nain Inc.
+
+bluetooth:v044C*
+ ID_VENDOR_FROM_DATABASE=LifeStyle Lock, LLC
+
+bluetooth:v044D*
+ ID_VENDOR_FROM_DATABASE=VEGA Grieshaber KG
+
+bluetooth:v044E*
+ ID_VENDOR_FROM_DATABASE=Xtrava Inc.
+
+bluetooth:v044F*
+ ID_VENDOR_FROM_DATABASE=TTS Tooltechnic Systems AG & Co. KG
+
+bluetooth:v0450*
+ ID_VENDOR_FROM_DATABASE=Teenage Engineering AB
+
+bluetooth:v0451*
+ ID_VENDOR_FROM_DATABASE=Tunstall Nordic AB
+
+bluetooth:v0452*
+ ID_VENDOR_FROM_DATABASE=Svep Design Center AB
+
+bluetooth:v0453*
+ ID_VENDOR_FROM_DATABASE=GreenPeak Technologies BV
+
+bluetooth:v0454*
+ ID_VENDOR_FROM_DATABASE=Sphinx Electronics GmbH & Co KG
+
+bluetooth:v0455*
+ ID_VENDOR_FROM_DATABASE=Atomation
+
+bluetooth:v0456*
+ ID_VENDOR_FROM_DATABASE=Nemik Consulting Inc
+
+bluetooth:v0457*
+ ID_VENDOR_FROM_DATABASE=RF INNOVATION
+
+bluetooth:v0458*
+ ID_VENDOR_FROM_DATABASE=Mini Solution Co., Ltd.
+
+bluetooth:v0459*
+ ID_VENDOR_FROM_DATABASE=Lumenetix, Inc
+
+bluetooth:v045A*
+ ID_VENDOR_FROM_DATABASE=2048450 Ontario Inc
+
+bluetooth:v045B*
+ ID_VENDOR_FROM_DATABASE=SPACEEK LTD
+
+bluetooth:v045C*
+ ID_VENDOR_FROM_DATABASE=Delta T Corporation
+
+bluetooth:v045D*
+ ID_VENDOR_FROM_DATABASE=Boston Scientific Corporation
+
+bluetooth:v045E*
+ ID_VENDOR_FROM_DATABASE=Nuviz, Inc.
+
+bluetooth:v045F*
+ ID_VENDOR_FROM_DATABASE=Real Time Automation, Inc.
+
+bluetooth:v0460*
+ ID_VENDOR_FROM_DATABASE=Kolibree
+
+bluetooth:v0461*
+ ID_VENDOR_FROM_DATABASE=vhf elektronik GmbH
+
+bluetooth:v0462*
+ ID_VENDOR_FROM_DATABASE=Bonsai Systems GmbH
+
+bluetooth:v0463*
+ ID_VENDOR_FROM_DATABASE=Fathom Systems Inc.
+
+bluetooth:v0464*
+ ID_VENDOR_FROM_DATABASE=Bellman & Symfon
+
+bluetooth:v0465*
+ ID_VENDOR_FROM_DATABASE=International Forte Group LLC
+
+bluetooth:v0466*
+ ID_VENDOR_FROM_DATABASE=CycleLabs Solutions inc.
+
+bluetooth:v0467*
+ ID_VENDOR_FROM_DATABASE=Codenex Oy
+
+bluetooth:v0468*
+ ID_VENDOR_FROM_DATABASE=Kynesim Ltd
+
+bluetooth:v0469*
+ ID_VENDOR_FROM_DATABASE=Palago AB
+
+bluetooth:v046A*
+ ID_VENDOR_FROM_DATABASE=INSIGMA INC.
+
+bluetooth:v046B*
+ ID_VENDOR_FROM_DATABASE=PMD Solutions
+
+bluetooth:v046C*
+ ID_VENDOR_FROM_DATABASE=Qingdao Realtime Technology Co., Ltd.
+
+bluetooth:v046D*
+ ID_VENDOR_FROM_DATABASE=BEGA Gantenbrink-Leuchten KG
+
+bluetooth:v046E*
+ ID_VENDOR_FROM_DATABASE=Pambor Ltd.
+
+bluetooth:v046F*
+ ID_VENDOR_FROM_DATABASE=Develco Products A/S
+
+bluetooth:v0470*
+ ID_VENDOR_FROM_DATABASE=iDesign s.r.l.
+
+bluetooth:v0471*
+ ID_VENDOR_FROM_DATABASE=TiVo Corp
+
+bluetooth:v0472*
+ ID_VENDOR_FROM_DATABASE=Control-J Pty Ltd
+
+bluetooth:v0473*
+ ID_VENDOR_FROM_DATABASE=Steelcase, Inc.
+
+bluetooth:v0474*
+ ID_VENDOR_FROM_DATABASE=iApartment co., ltd.
+
+bluetooth:v0475*
+ ID_VENDOR_FROM_DATABASE=Icom inc.
+
+bluetooth:v0476*
+ ID_VENDOR_FROM_DATABASE=Oxstren Wearable Technologies Private Limited
+
+bluetooth:v0477*
+ ID_VENDOR_FROM_DATABASE=Blue Spark Technologies
+
+bluetooth:v0478*
+ ID_VENDOR_FROM_DATABASE=FarSite Communications Limited
+
+bluetooth:v0479*
+ ID_VENDOR_FROM_DATABASE=mywerk system GmbH
+
+bluetooth:v047A*
+ ID_VENDOR_FROM_DATABASE=Sinosun Technology Co., Ltd.
+
+bluetooth:v047B*
+ ID_VENDOR_FROM_DATABASE=MIYOSHI ELECTRONICS CORPORATION
+
+bluetooth:v047C*
+ ID_VENDOR_FROM_DATABASE=POWERMAT LTD
+
+bluetooth:v047D*
+ ID_VENDOR_FROM_DATABASE=Occly LLC
+
+bluetooth:v047E*
+ ID_VENDOR_FROM_DATABASE=OurHub Dev IvS
+
+bluetooth:v047F*
+ ID_VENDOR_FROM_DATABASE=Pro-Mark, Inc.
+
+bluetooth:v0480*
+ ID_VENDOR_FROM_DATABASE=Dynometrics Inc.
+
+bluetooth:v0481*
+ ID_VENDOR_FROM_DATABASE=Quintrax Limited
+
+bluetooth:v0482*
+ ID_VENDOR_FROM_DATABASE=POS Tuning Udo Vosshenrich GmbH & Co. KG
+
+bluetooth:v0483*
+ ID_VENDOR_FROM_DATABASE=Multi Care Systems B.V.
+
+bluetooth:v0484*
+ ID_VENDOR_FROM_DATABASE=Revol Technologies Inc
+
+bluetooth:v0485*
+ ID_VENDOR_FROM_DATABASE=SKIDATA AG
+
+bluetooth:v0486*
+ ID_VENDOR_FROM_DATABASE=DEV TECNOLOGIA INDUSTRIA, COMERCIO E MANUTENCAO DE EQUIPAMENTOS LTDA. - ME
+
+bluetooth:v0487*
+ ID_VENDOR_FROM_DATABASE=Centrica Connected Home
+
+bluetooth:v0488*
+ ID_VENDOR_FROM_DATABASE=Automotive Data Solutions Inc
+
+bluetooth:v0489*
+ ID_VENDOR_FROM_DATABASE=Igarashi Engineering
+
+bluetooth:v048A*
+ ID_VENDOR_FROM_DATABASE=Taelek Oy
+
+bluetooth:v048B*
+ ID_VENDOR_FROM_DATABASE=CP Electronics Limited
+
+bluetooth:v048C*
+ ID_VENDOR_FROM_DATABASE=Vectronix AG
+
+bluetooth:v048D*
+ ID_VENDOR_FROM_DATABASE=S-Labs Sp. z o.o.
+
+bluetooth:v048E*
+ ID_VENDOR_FROM_DATABASE=Companion Medical, Inc.
+
+bluetooth:v048F*
+ ID_VENDOR_FROM_DATABASE=BlueKitchen GmbH
+
+bluetooth:v0490*
+ ID_VENDOR_FROM_DATABASE=Matting AB
+
+bluetooth:v0491*
+ ID_VENDOR_FROM_DATABASE=SOREX - Wireless Solutions GmbH
+
+bluetooth:v0492*
+ ID_VENDOR_FROM_DATABASE=ADC Technology, Inc.
+
+bluetooth:v0493*
+ ID_VENDOR_FROM_DATABASE=Lynxemi Pte Ltd
+
+bluetooth:v0494*
+ ID_VENDOR_FROM_DATABASE=SENNHEISER electronic GmbH & Co. KG
+
+bluetooth:v0495*
+ ID_VENDOR_FROM_DATABASE=LMT Mercer Group, Inc
+
+bluetooth:v0496*
+ ID_VENDOR_FROM_DATABASE=Polymorphic Labs LLC
+
+bluetooth:v0497*
+ ID_VENDOR_FROM_DATABASE=Cochlear Limited
+
+bluetooth:v0498*
+ ID_VENDOR_FROM_DATABASE=METER Group, Inc. USA
+
+bluetooth:v0499*
+ ID_VENDOR_FROM_DATABASE=Ruuvi Innovations Ltd.
+
+bluetooth:v049A*
+ ID_VENDOR_FROM_DATABASE=Situne AS
+
+bluetooth:v049B*
+ ID_VENDOR_FROM_DATABASE=nVisti, LLC
+
+bluetooth:v049C*
+ ID_VENDOR_FROM_DATABASE=DyOcean
+
+bluetooth:v049D*
+ ID_VENDOR_FROM_DATABASE=Uhlmann & Zacher GmbH
+
+bluetooth:v049E*
+ ID_VENDOR_FROM_DATABASE=AND!XOR LLC
+
+bluetooth:v049F*
+ ID_VENDOR_FROM_DATABASE=tictote AB
+
+bluetooth:v04A0*
+ ID_VENDOR_FROM_DATABASE=Vypin, LLC
+
+bluetooth:v04A1*
+ ID_VENDOR_FROM_DATABASE=PNI Sensor Corporation
+
+bluetooth:v04A2*
+ ID_VENDOR_FROM_DATABASE=ovrEngineered, LLC
+
+bluetooth:v04A3*
+ ID_VENDOR_FROM_DATABASE=GT-tronics HK Ltd
+
+bluetooth:v04A4*
+ ID_VENDOR_FROM_DATABASE=Herbert Waldmann GmbH & Co. KG
+
+bluetooth:v04A5*
+ ID_VENDOR_FROM_DATABASE=Guangzhou FiiO Electronics Technology Co.,Ltd
+
+bluetooth:v04A6*
+ ID_VENDOR_FROM_DATABASE=Vinetech Co., Ltd
+
+bluetooth:v04A7*
+ ID_VENDOR_FROM_DATABASE=Dallas Logic Corporation
+
+bluetooth:v04A8*
+ ID_VENDOR_FROM_DATABASE=BioTex, Inc.
+
+bluetooth:v04A9*
+ ID_VENDOR_FROM_DATABASE=DISCOVERY SOUND TECHNOLOGY, LLC
+
+bluetooth:v04AA*
+ ID_VENDOR_FROM_DATABASE=LINKIO SAS
+
+bluetooth:v04AB*
+ ID_VENDOR_FROM_DATABASE=Harbortronics, Inc.
+
+bluetooth:v04AC*
+ ID_VENDOR_FROM_DATABASE=Undagrid B.V.
+
+bluetooth:v04AD*
+ ID_VENDOR_FROM_DATABASE=Shure Inc
+
+bluetooth:v04AE*
+ ID_VENDOR_FROM_DATABASE=ERM Electronic Systems LTD
+
+bluetooth:v04AF*
+ ID_VENDOR_FROM_DATABASE=BIOROWER Handelsagentur GmbH
+
+bluetooth:v04B0*
+ ID_VENDOR_FROM_DATABASE=Weba Sport und Med. Artikel GmbH
+
+bluetooth:v04B1*
+ ID_VENDOR_FROM_DATABASE=Kartographers Technologies Pvt. Ltd.
+
+bluetooth:v04B2*
+ ID_VENDOR_FROM_DATABASE=The Shadow on the Moon
+
+bluetooth:v04B3*
+ ID_VENDOR_FROM_DATABASE=mobike (Hong Kong) Limited
+
+bluetooth:v04B4*
+ ID_VENDOR_FROM_DATABASE=Inuheat Group AB
+
+bluetooth:v04B5*
+ ID_VENDOR_FROM_DATABASE=Swiftronix AB
+
+bluetooth:v04B6*
+ ID_VENDOR_FROM_DATABASE=Diagnoptics Technologies
+
+bluetooth:v04B7*
+ ID_VENDOR_FROM_DATABASE=Analog Devices, Inc.
+
+bluetooth:v04B8*
+ ID_VENDOR_FROM_DATABASE=Soraa Inc.
+
+bluetooth:v04B9*
+ ID_VENDOR_FROM_DATABASE=CSR Building Products Limited
+
+bluetooth:v04BA*
+ ID_VENDOR_FROM_DATABASE=Crestron Electronics, Inc.
+
+bluetooth:v04BB*
+ ID_VENDOR_FROM_DATABASE=Neatebox Ltd
+
+bluetooth:v04BC*
+ ID_VENDOR_FROM_DATABASE=Draegerwerk AG & Co. KGaA
+
+bluetooth:v04BD*
+ ID_VENDOR_FROM_DATABASE=AlbynMedical
+
+bluetooth:v04BE*
+ ID_VENDOR_FROM_DATABASE=Averos FZCO
+
+bluetooth:v04BF*
+ ID_VENDOR_FROM_DATABASE=VIT Initiative, LLC
+
+bluetooth:v04C0*
+ ID_VENDOR_FROM_DATABASE=Statsports International
+
+bluetooth:v04C1*
+ ID_VENDOR_FROM_DATABASE=Sospitas, s.r.o.
+
+bluetooth:v04C2*
+ ID_VENDOR_FROM_DATABASE=Dmet Products Corp.
+
+bluetooth:v04C3*
+ ID_VENDOR_FROM_DATABASE=Mantracourt Electronics Limited
+
+bluetooth:v04C4*
+ ID_VENDOR_FROM_DATABASE=TeAM Hutchins AB
+
+bluetooth:v04C5*
+ ID_VENDOR_FROM_DATABASE=Seibert Williams Glass, LLC
+
+bluetooth:v04C6*
+ ID_VENDOR_FROM_DATABASE=Insta GmbH
+
+bluetooth:v04C7*
+ ID_VENDOR_FROM_DATABASE=Svantek Sp. z o.o.
+
+bluetooth:v04C8*
+ ID_VENDOR_FROM_DATABASE=Shanghai Flyco Electrical Appliance Co., Ltd.
+
+bluetooth:v04C9*
+ ID_VENDOR_FROM_DATABASE=Thornwave Labs Inc
+
+bluetooth:v04CA*
+ ID_VENDOR_FROM_DATABASE=Steiner-Optik GmbH
+
+bluetooth:v04CB*
+ ID_VENDOR_FROM_DATABASE=Novo Nordisk A/S
+
+bluetooth:v04CC*
+ ID_VENDOR_FROM_DATABASE=Enflux Inc.
+
+bluetooth:v04CD*
+ ID_VENDOR_FROM_DATABASE=Safetech Products LLC
+
+bluetooth:v04CE*
+ ID_VENDOR_FROM_DATABASE=GOOOLED S.R.L.
+
+bluetooth:v04CF*
+ ID_VENDOR_FROM_DATABASE=DOM Sicherheitstechnik GmbH & Co. KG
+
+bluetooth:v04D0*
+ ID_VENDOR_FROM_DATABASE=Olympus Corporation
+
+bluetooth:v04D1*
+ ID_VENDOR_FROM_DATABASE=KTS GmbH
+
+bluetooth:v04D2*
+ ID_VENDOR_FROM_DATABASE=Anloq Technologies Inc.
+
+bluetooth:v04D3*
+ ID_VENDOR_FROM_DATABASE=Queercon, Inc
+
+bluetooth:v04D4*
+ ID_VENDOR_FROM_DATABASE=5th Element Ltd
+
+bluetooth:v04D5*
+ ID_VENDOR_FROM_DATABASE=Gooee Limited
+
+bluetooth:v04D6*
+ ID_VENDOR_FROM_DATABASE=LUGLOC LLC
+
+bluetooth:v04D7*
+ ID_VENDOR_FROM_DATABASE=Blincam, Inc.
+
+bluetooth:v04D8*
+ ID_VENDOR_FROM_DATABASE=FUJIFILM Corporation
+
+bluetooth:v04D9*
+ ID_VENDOR_FROM_DATABASE=RandMcNally
+
+bluetooth:v04DA*
+ ID_VENDOR_FROM_DATABASE=Franceschi Marina snc
+
+bluetooth:v04DB*
+ ID_VENDOR_FROM_DATABASE=Engineered Audio, LLC.
+
+bluetooth:v04DC*
+ ID_VENDOR_FROM_DATABASE=IOTTIVE (OPC) PRIVATE LIMITED
+
+bluetooth:v04DD*
+ ID_VENDOR_FROM_DATABASE=4MOD Technology
+
+bluetooth:v04DE*
+ ID_VENDOR_FROM_DATABASE=Lutron Electronics Co., Inc.
+
+bluetooth:v04DF*
+ ID_VENDOR_FROM_DATABASE=Emerson
+
+bluetooth:v04E0*
+ ID_VENDOR_FROM_DATABASE=Guardtec, Inc.
+
+bluetooth:v04E1*
+ ID_VENDOR_FROM_DATABASE=REACTEC LIMITED
+
+bluetooth:v04E2*
+ ID_VENDOR_FROM_DATABASE=EllieGrid
+
+bluetooth:v04E3*
+ ID_VENDOR_FROM_DATABASE=Under Armour
+
+bluetooth:v04E4*
+ ID_VENDOR_FROM_DATABASE=Woodenshark
+
+bluetooth:v04E5*
+ ID_VENDOR_FROM_DATABASE=Avack Oy
+
+bluetooth:v04E6*
+ ID_VENDOR_FROM_DATABASE=Smart Solution Technology, Inc.
+
+bluetooth:v04E7*
+ ID_VENDOR_FROM_DATABASE=REHABTRONICS INC.
+
+bluetooth:v04E8*
+ ID_VENDOR_FROM_DATABASE=STABILO International
+
+bluetooth:v04E9*
+ ID_VENDOR_FROM_DATABASE=Busch Jaeger Elektro GmbH
+
+bluetooth:v04EA*
+ ID_VENDOR_FROM_DATABASE=Pacific Bioscience Laboratories, Inc
+
+bluetooth:v04EB*
+ ID_VENDOR_FROM_DATABASE=Bird Home Automation GmbH
+
+bluetooth:v04EC*
+ ID_VENDOR_FROM_DATABASE=Motorola Solutions
+
+bluetooth:v04ED*
+ ID_VENDOR_FROM_DATABASE=R9 Technology, Inc.
+
+bluetooth:v04EE*
+ ID_VENDOR_FROM_DATABASE=Auxivia
+
+bluetooth:v04EF*
+ ID_VENDOR_FROM_DATABASE=DaisyWorks, Inc
+
+bluetooth:v04F0*
+ ID_VENDOR_FROM_DATABASE=Kosi Limited
+
+bluetooth:v04F1*
+ ID_VENDOR_FROM_DATABASE=Theben AG
+
+bluetooth:v04F2*
+ ID_VENDOR_FROM_DATABASE=InDreamer Techsol Private Limited
+
+bluetooth:v04F3*
+ ID_VENDOR_FROM_DATABASE=Cerevast Medical
+
+bluetooth:v04F4*
+ ID_VENDOR_FROM_DATABASE=ZanCompute Inc.
+
+bluetooth:v04F5*
+ ID_VENDOR_FROM_DATABASE=Pirelli Tyre S.P.A.
+
+bluetooth:v04F6*
+ ID_VENDOR_FROM_DATABASE=McLear Limited
+
+bluetooth:v04F7*
+ ID_VENDOR_FROM_DATABASE=Shenzhen Huiding Technology Co.,Ltd.
+
+bluetooth:v04F8*
+ ID_VENDOR_FROM_DATABASE=Convergence Systems Limited
+
+bluetooth:v04F9*
+ ID_VENDOR_FROM_DATABASE=Interactio
+
+bluetooth:v04FA*
+ ID_VENDOR_FROM_DATABASE=Androtec GmbH
+
+bluetooth:v04FB*
+ ID_VENDOR_FROM_DATABASE=Benchmark Drives GmbH & Co. KG
+
+bluetooth:v04FC*
+ ID_VENDOR_FROM_DATABASE=SwingLync L. L. C.
+
+bluetooth:v04FD*
+ ID_VENDOR_FROM_DATABASE=Tapkey GmbH
+
+bluetooth:v04FE*
+ ID_VENDOR_FROM_DATABASE=Woosim Systems Inc.
+
+bluetooth:v04FF*
+ ID_VENDOR_FROM_DATABASE=Microsemi Corporation
+
+bluetooth:v0500*
+ ID_VENDOR_FROM_DATABASE=Wiliot LTD.
+
+bluetooth:v0501*
+ ID_VENDOR_FROM_DATABASE=Polaris IND
+
+bluetooth:v0502*
+ ID_VENDOR_FROM_DATABASE=Specifi-Kali LLC
+
+bluetooth:v0503*
+ ID_VENDOR_FROM_DATABASE=Locoroll, Inc
+
+bluetooth:v0504*
+ ID_VENDOR_FROM_DATABASE=PHYPLUS Inc
+
+bluetooth:v0505*
+ ID_VENDOR_FROM_DATABASE=Inplay Technologies LLC
+
+bluetooth:v0506*
+ ID_VENDOR_FROM_DATABASE=Hager
+
+bluetooth:v0507*
+ ID_VENDOR_FROM_DATABASE=Yellowcog
+
+bluetooth:v0508*
+ ID_VENDOR_FROM_DATABASE=Axes System sp. z o. o.
+
+bluetooth:v0509*
+ ID_VENDOR_FROM_DATABASE=myLIFTER Inc.
+
+bluetooth:v050A*
+ ID_VENDOR_FROM_DATABASE=Shake-on B.V.
+
+bluetooth:v050B*
+ ID_VENDOR_FROM_DATABASE=Vibrissa Inc.
+
+bluetooth:v050C*
+ ID_VENDOR_FROM_DATABASE=OSRAM GmbH
+
+bluetooth:v050D*
+ ID_VENDOR_FROM_DATABASE=TRSystems GmbH
+
+bluetooth:v050E*
+ ID_VENDOR_FROM_DATABASE=Yichip Microelectronics (Hangzhou) Co.,Ltd.
+
+bluetooth:v050F*
+ ID_VENDOR_FROM_DATABASE=Foundation Engineering LLC
+
+bluetooth:v0510*
+ ID_VENDOR_FROM_DATABASE=UNI-ELECTRONICS, INC.
+
+bluetooth:v0511*
+ ID_VENDOR_FROM_DATABASE=Brookfield Equinox LLC
+
+bluetooth:v0512*
+ ID_VENDOR_FROM_DATABASE=Soprod SA
+
+bluetooth:v0513*
+ ID_VENDOR_FROM_DATABASE=9974091 Canada Inc.
+
+bluetooth:v0514*
+ ID_VENDOR_FROM_DATABASE=FIBRO GmbH
+
+bluetooth:v0515*
+ ID_VENDOR_FROM_DATABASE=RB Controls Co., Ltd.
+
+bluetooth:v0516*
+ ID_VENDOR_FROM_DATABASE=Footmarks
+
+bluetooth:v0517*
+ ID_VENDOR_FROM_DATABASE=Amtronic Sverige AB (formerly Amcore AB)
+
+bluetooth:v0518*
+ ID_VENDOR_FROM_DATABASE=MAMORIO.inc
+
+bluetooth:v0519*
+ ID_VENDOR_FROM_DATABASE=Tyto Life LLC
+
+bluetooth:v051A*
+ ID_VENDOR_FROM_DATABASE=Leica Camera AG
+
+bluetooth:v051B*
+ ID_VENDOR_FROM_DATABASE=Angee Technologies Ltd.
+
+bluetooth:v051C*
+ ID_VENDOR_FROM_DATABASE=EDPS
+
+bluetooth:v051D*
+ ID_VENDOR_FROM_DATABASE=OFF Line Co., Ltd.
+
+bluetooth:v051E*
+ ID_VENDOR_FROM_DATABASE=Detect Blue Limited
+
+bluetooth:v051F*
+ ID_VENDOR_FROM_DATABASE=Setec Pty Ltd
+
+bluetooth:v0520*
+ ID_VENDOR_FROM_DATABASE=Target Corporation
+
+bluetooth:v0521*
+ ID_VENDOR_FROM_DATABASE=IAI Corporation
+
+bluetooth:v0522*
+ ID_VENDOR_FROM_DATABASE=NS Tech, Inc.
+
+bluetooth:v0523*
+ ID_VENDOR_FROM_DATABASE=MTG Co., Ltd.
+
+bluetooth:v0524*
+ ID_VENDOR_FROM_DATABASE=Hangzhou iMagic Technology Co., Ltd
+
+bluetooth:v0525*
+ ID_VENDOR_FROM_DATABASE=HONGKONG NANO IC TECHNOLOGIES CO., LIMITED
+
+bluetooth:v0526*
+ ID_VENDOR_FROM_DATABASE=Honeywell International Inc.
+
+bluetooth:v0527*
+ ID_VENDOR_FROM_DATABASE=Albrecht JUNG
+
+bluetooth:v0528*
+ ID_VENDOR_FROM_DATABASE=Lunera Lighting Inc.
+
+bluetooth:v0529*
+ ID_VENDOR_FROM_DATABASE=Lumen UAB
+
+bluetooth:v052A*
+ ID_VENDOR_FROM_DATABASE=Keynes Controls Ltd
+
+bluetooth:v052B*
+ ID_VENDOR_FROM_DATABASE=Novartis AG
+
+bluetooth:v052C*
+ ID_VENDOR_FROM_DATABASE=Geosatis SA
+
+bluetooth:v052D*
+ ID_VENDOR_FROM_DATABASE=EXFO, Inc.
+
+bluetooth:v052E*
+ ID_VENDOR_FROM_DATABASE=LEDVANCE GmbH
+
+bluetooth:v052F*
+ ID_VENDOR_FROM_DATABASE=Center ID Corp.
+
+bluetooth:v0530*
+ ID_VENDOR_FROM_DATABASE=Adolene, Inc.
+
+bluetooth:v0531*
+ ID_VENDOR_FROM_DATABASE=D&M Holdings Inc.
+
+bluetooth:v0532*
+ ID_VENDOR_FROM_DATABASE=CRESCO Wireless, Inc.
+
+bluetooth:v0533*
+ ID_VENDOR_FROM_DATABASE=Nura Operations Pty Ltd
+
+bluetooth:v0534*
+ ID_VENDOR_FROM_DATABASE=Frontiergadget, Inc.
+
+bluetooth:v0535*
+ ID_VENDOR_FROM_DATABASE=Smart Component Technologies Limited
+
+bluetooth:v0536*
+ ID_VENDOR_FROM_DATABASE=ZTR Control Systems LLC
+
+bluetooth:v0537*
+ ID_VENDOR_FROM_DATABASE=MetaLogics Corporation
+
+bluetooth:v0538*
+ ID_VENDOR_FROM_DATABASE=Medela AG
+
+bluetooth:v0539*
+ ID_VENDOR_FROM_DATABASE=OPPLE Lighting Co., Ltd
+
+bluetooth:v053A*
+ ID_VENDOR_FROM_DATABASE=Savitech Corp.,
+
+bluetooth:v053B*
+ ID_VENDOR_FROM_DATABASE=prodigy
+
+bluetooth:v053C*
+ ID_VENDOR_FROM_DATABASE=Screenovate Technologies Ltd
+
+bluetooth:v053D*
+ ID_VENDOR_FROM_DATABASE=TESA SA
+
+bluetooth:v053E*
+ ID_VENDOR_FROM_DATABASE=CLIM8 LIMITED
+
+bluetooth:v053F*
+ ID_VENDOR_FROM_DATABASE=Silergy Corp
+
+bluetooth:v0540*
+ ID_VENDOR_FROM_DATABASE=SilverPlus, Inc
+
+bluetooth:v0541*
+ ID_VENDOR_FROM_DATABASE=Sharknet srl
+
+bluetooth:v0542*
+ ID_VENDOR_FROM_DATABASE=Mist Systems, Inc.
+
+bluetooth:v0543*
+ ID_VENDOR_FROM_DATABASE=MIWA LOCK CO.,Ltd
+
+bluetooth:v0544*
+ ID_VENDOR_FROM_DATABASE=OrthoSensor, Inc.
+
+bluetooth:v0545*
+ ID_VENDOR_FROM_DATABASE=Candy Hoover Group s.r.l
+
+bluetooth:v0546*
+ ID_VENDOR_FROM_DATABASE=Apexar Technologies S.A.
+
+bluetooth:v0547*
+ ID_VENDOR_FROM_DATABASE=LOGICDATA d.o.o.
+
+bluetooth:v0548*
+ ID_VENDOR_FROM_DATABASE=Knick Elektronische Messgeraete GmbH & Co. KG
+
+bluetooth:v0549*
+ ID_VENDOR_FROM_DATABASE=Smart Technologies and Investment Limited
+
+bluetooth:v054A*
+ ID_VENDOR_FROM_DATABASE=Linough Inc.
+
+bluetooth:v054B*
+ ID_VENDOR_FROM_DATABASE=Advanced Electronic Designs, Inc.
+
+bluetooth:v054C*
+ ID_VENDOR_FROM_DATABASE=Carefree Scott Fetzer Co Inc
+
+bluetooth:v054D*
+ ID_VENDOR_FROM_DATABASE=Sensome
+
+bluetooth:v054E*
+ ID_VENDOR_FROM_DATABASE=FORTRONIK storitve d.o.o.
+
+bluetooth:v054F*
+ ID_VENDOR_FROM_DATABASE=Sinnoz
+
+bluetooth:v0550*
+ ID_VENDOR_FROM_DATABASE=Versa Networks, Inc.
+
+bluetooth:v0551*
+ ID_VENDOR_FROM_DATABASE=Sylero
+
+bluetooth:v0552*
+ ID_VENDOR_FROM_DATABASE=Avempace SARL
+
+bluetooth:v0553*
+ ID_VENDOR_FROM_DATABASE=Nintendo Co., Ltd.
+
+bluetooth:v0554*
+ ID_VENDOR_FROM_DATABASE=National Instruments
+
+bluetooth:v0555*
+ ID_VENDOR_FROM_DATABASE=KROHNE Messtechnik GmbH
+
+bluetooth:v0556*
+ ID_VENDOR_FROM_DATABASE=Otodynamics Ltd
+
+bluetooth:v0557*
+ ID_VENDOR_FROM_DATABASE=Arwin Technology Limited
+
+bluetooth:v0558*
+ ID_VENDOR_FROM_DATABASE=benegear, inc.
+
+bluetooth:v0559*
+ ID_VENDOR_FROM_DATABASE=Newcon Optik
+
+bluetooth:v055A*
+ ID_VENDOR_FROM_DATABASE=CANDY HOUSE, Inc.
+
+bluetooth:v055B*
+ ID_VENDOR_FROM_DATABASE=FRANKLIN TECHNOLOGY INC
+
+bluetooth:v055C*
+ ID_VENDOR_FROM_DATABASE=Lely
+
+bluetooth:v055D*
+ ID_VENDOR_FROM_DATABASE=Valve Corporation
+
+bluetooth:v055E*
+ ID_VENDOR_FROM_DATABASE=Hekatron Vertriebs GmbH
+
+bluetooth:v055F*
+ ID_VENDOR_FROM_DATABASE=PROTECH S.A.S. DI GIRARDI ANDREA & C.
+
+bluetooth:v0560*
+ ID_VENDOR_FROM_DATABASE=Sarita CareTech APS (formerly Sarita CareTech IVS)
+
+bluetooth:v0561*
+ ID_VENDOR_FROM_DATABASE=Finder S.p.A.
+
+bluetooth:v0562*
+ ID_VENDOR_FROM_DATABASE=Thalmic Labs Inc.
+
+bluetooth:v0563*
+ ID_VENDOR_FROM_DATABASE=Steinel Vertrieb GmbH
+
+bluetooth:v0564*
+ ID_VENDOR_FROM_DATABASE=Beghelli Spa
+
+bluetooth:v0565*
+ ID_VENDOR_FROM_DATABASE=Beijing Smartspace Technologies Inc.
+
+bluetooth:v0566*
+ ID_VENDOR_FROM_DATABASE=CORE TRANSPORT TECHNOLOGIES NZ LIMITED
+
+bluetooth:v0567*
+ ID_VENDOR_FROM_DATABASE=Xiamen Everesports Goods Co., Ltd
+
+bluetooth:v0568*
+ ID_VENDOR_FROM_DATABASE=Bodyport Inc.
+
+bluetooth:v0569*
+ ID_VENDOR_FROM_DATABASE=Audionics System, INC.
+
+bluetooth:v056A*
+ ID_VENDOR_FROM_DATABASE=Flipnavi Co.,Ltd.
+
+bluetooth:v056B*
+ ID_VENDOR_FROM_DATABASE=Rion Co., Ltd.
+
+bluetooth:v056C*
+ ID_VENDOR_FROM_DATABASE=Long Range Systems, LLC
+
+bluetooth:v056D*
+ ID_VENDOR_FROM_DATABASE=Redmond Industrial Group LLC
+
+bluetooth:v056E*
+ ID_VENDOR_FROM_DATABASE=VIZPIN INC.
+
+bluetooth:v056F*
+ ID_VENDOR_FROM_DATABASE=BikeFinder AS
+
+bluetooth:v0570*
+ ID_VENDOR_FROM_DATABASE=Consumer Sleep Solutions LLC
+
+bluetooth:v0571*
+ ID_VENDOR_FROM_DATABASE=PSIKICK, INC.
+
+bluetooth:v0572*
+ ID_VENDOR_FROM_DATABASE=AntTail.com
+
+bluetooth:v0573*
+ ID_VENDOR_FROM_DATABASE=Lighting Science Group Corp.
+
+bluetooth:v0574*
+ ID_VENDOR_FROM_DATABASE=AFFORDABLE ELECTRONICS INC
+
+bluetooth:v0575*
+ ID_VENDOR_FROM_DATABASE=Integral Memroy Plc
+
+bluetooth:v0576*
+ ID_VENDOR_FROM_DATABASE=Globalstar, Inc.
+
+bluetooth:v0577*
+ ID_VENDOR_FROM_DATABASE=True Wearables, Inc.
+
+bluetooth:v0578*
+ ID_VENDOR_FROM_DATABASE=Wellington Drive Technologies Ltd
+
+bluetooth:v0579*
+ ID_VENDOR_FROM_DATABASE=Ensemble Tech Private Limited
+
+bluetooth:v057A*
+ ID_VENDOR_FROM_DATABASE=OMNI Remotes
+
+bluetooth:v057B*
+ ID_VENDOR_FROM_DATABASE=Duracell U.S. Operations Inc.
+
+bluetooth:v057C*
+ ID_VENDOR_FROM_DATABASE=Toor Technologies LLC
+
+bluetooth:v057D*
+ ID_VENDOR_FROM_DATABASE=Instinct Performance
+
+bluetooth:v057E*
+ ID_VENDOR_FROM_DATABASE=Beco, Inc
+
+bluetooth:v057F*
+ ID_VENDOR_FROM_DATABASE=Scuf Gaming International, LLC
+
+bluetooth:v0580*
+ ID_VENDOR_FROM_DATABASE=ARANZ Medical Limited
+
+bluetooth:v0581*
+ ID_VENDOR_FROM_DATABASE=LYS TECHNOLOGIES LTD
+
+bluetooth:v0582*
+ ID_VENDOR_FROM_DATABASE=Breakwall Analytics, LLC
+
+bluetooth:v0583*
+ ID_VENDOR_FROM_DATABASE=Code Blue Communications
+
+bluetooth:v0584*
+ ID_VENDOR_FROM_DATABASE=Gira Giersiepen GmbH & Co. KG
+
+bluetooth:v0585*
+ ID_VENDOR_FROM_DATABASE=Hearing Lab Technology
+
+bluetooth:v0586*
+ ID_VENDOR_FROM_DATABASE=LEGRAND
+
+bluetooth:v0587*
+ ID_VENDOR_FROM_DATABASE=Derichs GmbH
+
+bluetooth:v0588*
+ ID_VENDOR_FROM_DATABASE=ALT-TEKNIK LLC
+
+bluetooth:v0589*
+ ID_VENDOR_FROM_DATABASE=Star Technologies
+
+bluetooth:v058A*
+ ID_VENDOR_FROM_DATABASE=START TODAY CO.,LTD.
+
+bluetooth:v058B*
+ ID_VENDOR_FROM_DATABASE=Maxim Integrated Products
+
+bluetooth:v058C*
+ ID_VENDOR_FROM_DATABASE=MERCK Kommanditgesellschaft auf Aktien
+
+bluetooth:v058D*
+ ID_VENDOR_FROM_DATABASE=Jungheinrich Aktiengesellschaft
+
+bluetooth:v058E*
+ ID_VENDOR_FROM_DATABASE=Oculus VR, LLC
+
+bluetooth:v058F*
+ ID_VENDOR_FROM_DATABASE=HENDON SEMICONDUCTORS PTY LTD
+
+bluetooth:v0590*
+ ID_VENDOR_FROM_DATABASE=Pur3 Ltd
+
+bluetooth:v0591*
+ ID_VENDOR_FROM_DATABASE=Viasat Group S.p.A.
+
+bluetooth:v0592*
+ ID_VENDOR_FROM_DATABASE=IZITHERM
+
+bluetooth:v0593*
+ ID_VENDOR_FROM_DATABASE=Spaulding Clinical Research
+
+bluetooth:v0594*
+ ID_VENDOR_FROM_DATABASE=Kohler Company
+
+bluetooth:v0595*
+ ID_VENDOR_FROM_DATABASE=Inor Process AB
+
+bluetooth:v0596*
+ ID_VENDOR_FROM_DATABASE=My Smart Blinds
+
+bluetooth:v0597*
+ ID_VENDOR_FROM_DATABASE=RadioPulse Inc
+
+bluetooth:v0598*
+ ID_VENDOR_FROM_DATABASE=rapitag GmbH
+
+bluetooth:v0599*
+ ID_VENDOR_FROM_DATABASE=Lazlo326, LLC.
+
+bluetooth:v059A*
+ ID_VENDOR_FROM_DATABASE=Teledyne Lecroy, Inc.
+
+bluetooth:v059B*
+ ID_VENDOR_FROM_DATABASE=Dataflow Systems Limited
+
+bluetooth:v059C*
+ ID_VENDOR_FROM_DATABASE=Macrogiga Electronics
+
+bluetooth:v059D*
+ ID_VENDOR_FROM_DATABASE=Tandem Diabetes Care
+
+bluetooth:v059E*
+ ID_VENDOR_FROM_DATABASE=Polycom, Inc.
+
+bluetooth:v059F*
+ ID_VENDOR_FROM_DATABASE=Fisher & Paykel Healthcare
+
+bluetooth:v05A0*
+ ID_VENDOR_FROM_DATABASE=RCP Software Oy
+
+bluetooth:v05A1*
+ ID_VENDOR_FROM_DATABASE=Shanghai Xiaoyi Technology Co.,Ltd.
+
+bluetooth:v05A2*
+ ID_VENDOR_FROM_DATABASE=ADHERIUM(NZ) LIMITED
+
+bluetooth:v05A3*
+ ID_VENDOR_FROM_DATABASE=Axiomware Systems Incorporated
+
+bluetooth:v05A4*
+ ID_VENDOR_FROM_DATABASE=O. E. M. Controls, Inc.
+
+bluetooth:v05A5*
+ ID_VENDOR_FROM_DATABASE=Kiiroo BV
+
+bluetooth:v05A6*
+ ID_VENDOR_FROM_DATABASE=Telecon Mobile Limited
+
+bluetooth:v05A7*
+ ID_VENDOR_FROM_DATABASE=Sonos Inc
+
+bluetooth:v05A8*
+ ID_VENDOR_FROM_DATABASE=Tom Allebrandi Consulting
+
+bluetooth:v05A9*
+ ID_VENDOR_FROM_DATABASE=Monidor
+
+bluetooth:v05AA*
+ ID_VENDOR_FROM_DATABASE=Tramex Limited
+
+bluetooth:v05AB*
+ ID_VENDOR_FROM_DATABASE=Nofence AS
+
+bluetooth:v05AC*
+ ID_VENDOR_FROM_DATABASE=GoerTek Dynaudio Co., Ltd.
+
+bluetooth:v05AD*
+ ID_VENDOR_FROM_DATABASE=INIA
+
+bluetooth:v05AE*
+ ID_VENDOR_FROM_DATABASE=CARMATE MFG.CO.,LTD
+
+bluetooth:v05AF*
+ ID_VENDOR_FROM_DATABASE=ONvocal
+
+bluetooth:v05B0*
+ ID_VENDOR_FROM_DATABASE=NewTec GmbH
+
+bluetooth:v05B1*
+ ID_VENDOR_FROM_DATABASE=Medallion Instrumentation Systems
+
+bluetooth:v05B2*
+ ID_VENDOR_FROM_DATABASE=CAREL INDUSTRIES S.P.A.
+
+bluetooth:v05B3*
+ ID_VENDOR_FROM_DATABASE=Parabit Systems, Inc.
+
+bluetooth:v05B4*
+ ID_VENDOR_FROM_DATABASE=White Horse Scientific ltd
+
+bluetooth:v05B5*
+ ID_VENDOR_FROM_DATABASE=verisilicon
+
+bluetooth:v05B6*
+ ID_VENDOR_FROM_DATABASE=Elecs Industry Co.,Ltd.
+
+bluetooth:v05B7*
+ ID_VENDOR_FROM_DATABASE=Beijing Pinecone Electronics Co.,Ltd.
+
+bluetooth:v05B8*
+ ID_VENDOR_FROM_DATABASE=Ambystoma Labs Inc.
+
+bluetooth:v05B9*
+ ID_VENDOR_FROM_DATABASE=Suzhou Pairlink Network Technology
+
+bluetooth:v05BA*
+ ID_VENDOR_FROM_DATABASE=igloohome
+
+bluetooth:v05BB*
+ ID_VENDOR_FROM_DATABASE=Oxford Metrics plc
+
+bluetooth:v05BC*
+ ID_VENDOR_FROM_DATABASE=Leviton Mfg. Co., Inc.
+
+bluetooth:v05BD*
+ ID_VENDOR_FROM_DATABASE=ULC Robotics Inc.
+
+bluetooth:v05BE*
+ ID_VENDOR_FROM_DATABASE=RFID Global by Softwork SrL
+
+bluetooth:v05BF*
+ ID_VENDOR_FROM_DATABASE=Real-World-Systems Corporation
+
+bluetooth:v05C0*
+ ID_VENDOR_FROM_DATABASE=Nalu Medical, Inc.
+
+bluetooth:v05C1*
+ ID_VENDOR_FROM_DATABASE=P.I.Engineering
+
+bluetooth:v05C2*
+ ID_VENDOR_FROM_DATABASE=Grote Industries
+
+bluetooth:v05C3*
+ ID_VENDOR_FROM_DATABASE=Runtime, Inc.
+
+bluetooth:v05C4*
+ ID_VENDOR_FROM_DATABASE=Codecoup sp. z o.o. sp. k.
+
+bluetooth:v05C5*
+ ID_VENDOR_FROM_DATABASE=SELVE GmbH & Co. KG
+
+bluetooth:v05C6*
+ ID_VENDOR_FROM_DATABASE=Smart Animal Training Systems, LLC
+
+bluetooth:v05C7*
+ ID_VENDOR_FROM_DATABASE=Lippert Components, INC
+
+bluetooth:v05C8*
+ ID_VENDOR_FROM_DATABASE=SOMFY SAS
+
+bluetooth:v05C9*
+ ID_VENDOR_FROM_DATABASE=TBS Electronics B.V.
+
+bluetooth:v05CA*
+ ID_VENDOR_FROM_DATABASE=MHL Custom Inc
+
+bluetooth:v05CB*
+ ID_VENDOR_FROM_DATABASE=LucentWear LLC
+
+bluetooth:v05CC*
+ ID_VENDOR_FROM_DATABASE=WATTS ELECTRONICS
+
+bluetooth:v05CD*
+ ID_VENDOR_FROM_DATABASE=RJ Brands LLC
+
+bluetooth:v05CE*
+ ID_VENDOR_FROM_DATABASE=V-ZUG Ltd
+
+bluetooth:v05CF*
+ ID_VENDOR_FROM_DATABASE=Biowatch SA
+
+bluetooth:v05D0*
+ ID_VENDOR_FROM_DATABASE=Anova Applied Electronics
+
+bluetooth:v05D1*
+ ID_VENDOR_FROM_DATABASE=Lindab AB
+
+bluetooth:v05D2*
+ ID_VENDOR_FROM_DATABASE=frogblue TECHNOLOGY GmbH
+
+bluetooth:v05D3*
+ ID_VENDOR_FROM_DATABASE=Acurable Limited
+
+bluetooth:v05D4*
+ ID_VENDOR_FROM_DATABASE=LAMPLIGHT Co., Ltd.
+
+bluetooth:v05D5*
+ ID_VENDOR_FROM_DATABASE=TEGAM, Inc.
+
+bluetooth:v05D6*
+ ID_VENDOR_FROM_DATABASE=Zhuhai Jieli technology Co.,Ltd
+
+bluetooth:v05D7*
+ ID_VENDOR_FROM_DATABASE=modum.io AG
+
+bluetooth:v05D8*
+ ID_VENDOR_FROM_DATABASE=Farm Jenny LLC
+
+bluetooth:v05D9*
+ ID_VENDOR_FROM_DATABASE=Toyo Electronics Corporation
+
+bluetooth:v05DA*
+ ID_VENDOR_FROM_DATABASE=Applied Neural Research Corp
+
+bluetooth:v05DB*
+ ID_VENDOR_FROM_DATABASE=Avid Identification Systems, Inc.
+
+bluetooth:v05DC*
+ ID_VENDOR_FROM_DATABASE=Petronics Inc.
+
+bluetooth:v05DD*
+ ID_VENDOR_FROM_DATABASE=essentim GmbH
+
+bluetooth:v05DE*
+ ID_VENDOR_FROM_DATABASE=QT Medical INC.
+
+bluetooth:v05DF*
+ ID_VENDOR_FROM_DATABASE=VIRTUALCLINIC.DIRECT LIMITED
+
+bluetooth:v05E0*
+ ID_VENDOR_FROM_DATABASE=Viper Design LLC
+
+bluetooth:v05E1*
+ ID_VENDOR_FROM_DATABASE=Human, Incorporated
+
+bluetooth:v05E2*
+ ID_VENDOR_FROM_DATABASE=stAPPtronics GmbH
+
+bluetooth:v05E3*
+ ID_VENDOR_FROM_DATABASE=Elemental Machines, Inc.
+
+bluetooth:v05E4*
+ ID_VENDOR_FROM_DATABASE=Taiyo Yuden Co., Ltd
+
+bluetooth:v05E5*
+ ID_VENDOR_FROM_DATABASE=INEO ENERGY& SYSTEMS
+
+bluetooth:v05E6*
+ ID_VENDOR_FROM_DATABASE=Motion Instruments Inc.
+
+bluetooth:v05E7*
+ ID_VENDOR_FROM_DATABASE=PressurePro
+
+bluetooth:v05E8*
+ ID_VENDOR_FROM_DATABASE=COWBOY
+
+bluetooth:v05E9*
+ ID_VENDOR_FROM_DATABASE=iconmobile GmbH
+
+bluetooth:v05EA*
+ ID_VENDOR_FROM_DATABASE=ACS-Control-System GmbH
+
+bluetooth:v05EB*
+ ID_VENDOR_FROM_DATABASE=Bayerische Motoren Werke AG
+
+bluetooth:v05EC*
+ ID_VENDOR_FROM_DATABASE=Gycom Svenska AB
+
+bluetooth:v05ED*
+ ID_VENDOR_FROM_DATABASE=Fuji Xerox Co., Ltd
+
+bluetooth:v05EE*
+ ID_VENDOR_FROM_DATABASE=Glide Inc.
+
+bluetooth:v05EF*
+ ID_VENDOR_FROM_DATABASE=SIKOM AS
+
+bluetooth:v05F0*
+ ID_VENDOR_FROM_DATABASE=beken
+
+bluetooth:v05F1*
+ ID_VENDOR_FROM_DATABASE=The Linux Foundation
+
+bluetooth:v05F2*
+ ID_VENDOR_FROM_DATABASE=Try and E CO.,LTD.
+
+bluetooth:v05F3*
+ ID_VENDOR_FROM_DATABASE=SeeScan
+
+bluetooth:v05F4*
+ ID_VENDOR_FROM_DATABASE=Clearity, LLC
+
+bluetooth:v05F5*
+ ID_VENDOR_FROM_DATABASE=GS TAG
+
+bluetooth:v05F6*
+ ID_VENDOR_FROM_DATABASE=DPTechnics
+
+bluetooth:v05F7*
+ ID_VENDOR_FROM_DATABASE=TRACMO, INC.
+
+bluetooth:v05F8*
+ ID_VENDOR_FROM_DATABASE=Anki Inc.
+
+bluetooth:v05F9*
+ ID_VENDOR_FROM_DATABASE=Hagleitner Hygiene International GmbH
+
+bluetooth:v05FA*
+ ID_VENDOR_FROM_DATABASE=Konami Sports Life Co., Ltd.
+
+bluetooth:v05FB*
+ ID_VENDOR_FROM_DATABASE=Arblet Inc.
+
+bluetooth:v05FC*
+ ID_VENDOR_FROM_DATABASE=Masbando GmbH
+
+bluetooth:v05FD*
+ ID_VENDOR_FROM_DATABASE=Innoseis
+
+bluetooth:v05FE*
+ ID_VENDOR_FROM_DATABASE=Niko nv
+
+bluetooth:v05FF*
+ ID_VENDOR_FROM_DATABASE=Wellnomics Ltd
+
+bluetooth:v0600*
+ ID_VENDOR_FROM_DATABASE=iRobot Corporation
+
+bluetooth:v0601*
+ ID_VENDOR_FROM_DATABASE=Schrader Electronics
+
+bluetooth:v0602*
+ ID_VENDOR_FROM_DATABASE=Geberit International AG
+
+bluetooth:v0603*
+ ID_VENDOR_FROM_DATABASE=Fourth Evolution Inc
+
+bluetooth:v0604*
+ ID_VENDOR_FROM_DATABASE=Cell2Jack LLC
+
+bluetooth:v0605*
+ ID_VENDOR_FROM_DATABASE=FMW electronic Futterer u. Maier-Wolf OHG
+
+bluetooth:v0606*
+ ID_VENDOR_FROM_DATABASE=John Deere
+
+bluetooth:v0607*
+ ID_VENDOR_FROM_DATABASE=Rookery Technology Ltd
+
+bluetooth:v0608*
+ ID_VENDOR_FROM_DATABASE=KeySafe-Cloud
+
+bluetooth:v0609*
+ ID_VENDOR_FROM_DATABASE=BUCHI Labortechnik AG
+
+bluetooth:v060A*
+ ID_VENDOR_FROM_DATABASE=IQAir AG
+
+bluetooth:v060B*
+ ID_VENDOR_FROM_DATABASE=Triax Technologies Inc
+
+bluetooth:v060C*
+ ID_VENDOR_FROM_DATABASE=Vuzix Corporation
+
+bluetooth:v060D*
+ ID_VENDOR_FROM_DATABASE=TDK Corporation
+
+bluetooth:v060E*
+ ID_VENDOR_FROM_DATABASE=Blueair AB
+
+bluetooth:v060F*
+ ID_VENDOR_FROM_DATABASE=Signify Netherlands
+
+bluetooth:v0610*
+ ID_VENDOR_FROM_DATABASE=ADH GUARDIAN USA LLC
+
+bluetooth:v0611*
+ ID_VENDOR_FROM_DATABASE=Beurer GmbH
+
+bluetooth:v0612*
+ ID_VENDOR_FROM_DATABASE=Playfinity AS
+
+bluetooth:v0613*
+ ID_VENDOR_FROM_DATABASE=Hans Dinslage GmbH
+
+bluetooth:v0614*
+ ID_VENDOR_FROM_DATABASE=OnAsset Intelligence, Inc.
+
+bluetooth:v0615*
+ ID_VENDOR_FROM_DATABASE=INTER ACTION Corporation
+
+bluetooth:v0616*
+ ID_VENDOR_FROM_DATABASE=OS42 UG (haftungsbeschraenkt)
+
+bluetooth:v0617*
+ ID_VENDOR_FROM_DATABASE=WIZCONNECTED COMPANY LIMITED
+
+bluetooth:v0618*
+ ID_VENDOR_FROM_DATABASE=Audio-Technica Corporation
+
+bluetooth:v0619*
+ ID_VENDOR_FROM_DATABASE=Six Guys Labs, s.r.o.
+
+bluetooth:v061A*
+ ID_VENDOR_FROM_DATABASE=R.W. Beckett Corporation
+
+bluetooth:v061B*
+ ID_VENDOR_FROM_DATABASE=silex technology, inc.
+
+bluetooth:v061C*
+ ID_VENDOR_FROM_DATABASE=Univations Limited
+
+bluetooth:v061D*
+ ID_VENDOR_FROM_DATABASE=SENS Innovation ApS
+
+bluetooth:v061E*
+ ID_VENDOR_FROM_DATABASE=Diamond Kinetics, Inc.
+
+bluetooth:v061F*
+ ID_VENDOR_FROM_DATABASE=Phrame Inc.
+
+bluetooth:v0620*
+ ID_VENDOR_FROM_DATABASE=Forciot Oy
+
+bluetooth:v0621*
+ ID_VENDOR_FROM_DATABASE=Noordung d.o.o.
+
+bluetooth:v0622*
+ ID_VENDOR_FROM_DATABASE=Beam Labs, LLC
+
+bluetooth:v0623*
+ ID_VENDOR_FROM_DATABASE=Philadelphia Scientific (U.K.) Limited
+
+bluetooth:v0624*
+ ID_VENDOR_FROM_DATABASE=Biovotion AG
+
+bluetooth:v0625*
+ ID_VENDOR_FROM_DATABASE=Square Panda, Inc.
+
+bluetooth:v0626*
+ ID_VENDOR_FROM_DATABASE=Amplifico
+
+bluetooth:v0627*
+ ID_VENDOR_FROM_DATABASE=WEG S.A.
+
+bluetooth:v0628*
+ ID_VENDOR_FROM_DATABASE=Ensto Oy
+
+bluetooth:v0629*
+ ID_VENDOR_FROM_DATABASE=PHONEPE PVT LTD
+
+bluetooth:v062A*
+ ID_VENDOR_FROM_DATABASE=Lunatico Astronomia SL
+
+bluetooth:v062B*
+ ID_VENDOR_FROM_DATABASE=MinebeaMitsumi Inc.
+
+bluetooth:v062C*
+ ID_VENDOR_FROM_DATABASE=ASPion GmbH
+
+bluetooth:v062D*
+ ID_VENDOR_FROM_DATABASE=Vossloh-Schwabe Deutschland GmbH
+
+bluetooth:v062E*
+ ID_VENDOR_FROM_DATABASE=Procept
+
+bluetooth:v062F*
+ ID_VENDOR_FROM_DATABASE=ONKYO Corporation
+
+bluetooth:v0630*
+ ID_VENDOR_FROM_DATABASE=Asthrea D.O.O.
+
+bluetooth:v0631*
+ ID_VENDOR_FROM_DATABASE=Fortiori Design LLC
+
+bluetooth:v0632*
+ ID_VENDOR_FROM_DATABASE=Hugo Muller GmbH & Co KG
+
+bluetooth:v0633*
+ ID_VENDOR_FROM_DATABASE=Wangi Lai PLT
+
+bluetooth:v0634*
+ ID_VENDOR_FROM_DATABASE=Fanstel Corp
+
+bluetooth:v0635*
+ ID_VENDOR_FROM_DATABASE=Crookwood
+
+bluetooth:v0636*
+ ID_VENDOR_FROM_DATABASE=ELECTRONICA INTEGRAL DE SONIDO S.A.
+
+bluetooth:v0637*
+ ID_VENDOR_FROM_DATABASE=GiP Innovation Tools GmbH
+
+bluetooth:v0638*
+ ID_VENDOR_FROM_DATABASE=LX SOLUTIONS PTY LIMITED
+
+bluetooth:v0639*
+ ID_VENDOR_FROM_DATABASE=Shenzhen Minew Technologies Co., Ltd.
+
+bluetooth:v063A*
+ ID_VENDOR_FROM_DATABASE=Prolojik Limited
+
+bluetooth:v063B*
+ ID_VENDOR_FROM_DATABASE=Kromek Group Plc
+
+bluetooth:v063C*
+ ID_VENDOR_FROM_DATABASE=Contec Medical Systems Co., Ltd.
+
+bluetooth:v063D*
+ ID_VENDOR_FROM_DATABASE=Xradio Technology Co.,Ltd.
+
+bluetooth:v063E*
+ ID_VENDOR_FROM_DATABASE=The Indoor Lab, LLC
+
+bluetooth:v063F*
+ ID_VENDOR_FROM_DATABASE=LDL TECHNOLOGY
+
+bluetooth:v0640*
+ ID_VENDOR_FROM_DATABASE=Parkifi
+
+bluetooth:v0641*
+ ID_VENDOR_FROM_DATABASE=Revenue Collection Systems FRANCE SAS
+
+bluetooth:v0642*
+ ID_VENDOR_FROM_DATABASE=Bluetrum Technology Co.,Ltd
+
+bluetooth:v0643*
+ ID_VENDOR_FROM_DATABASE=makita corporation
+
+bluetooth:v0644*
+ ID_VENDOR_FROM_DATABASE=Apogee Instruments
+
+bluetooth:v0645*
+ ID_VENDOR_FROM_DATABASE=BM3
+
+bluetooth:v0646*
+ ID_VENDOR_FROM_DATABASE=SGV Group Holding GmbH & Co. KG
+
+bluetooth:v0647*
+ ID_VENDOR_FROM_DATABASE=MED-EL
+
+bluetooth:v0648*
+ ID_VENDOR_FROM_DATABASE=Ultune Technologies
+
+bluetooth:v0649*
+ ID_VENDOR_FROM_DATABASE=Ryeex Technology Co.,Ltd.
+
+bluetooth:v064A*
+ ID_VENDOR_FROM_DATABASE=Open Research Institute, Inc.
+
+bluetooth:v064B*
+ ID_VENDOR_FROM_DATABASE=Scale-Tec, Ltd
+
+bluetooth:v064C*
+ ID_VENDOR_FROM_DATABASE=Zumtobel Group AG
+
+bluetooth:v064D*
+ ID_VENDOR_FROM_DATABASE=iLOQ Oy
+
+bluetooth:v064E*
+ ID_VENDOR_FROM_DATABASE=KRUXWorks Technologies Private Limited
+
+bluetooth:v064F*
+ ID_VENDOR_FROM_DATABASE=Digital Matter Pty Ltd
+
+bluetooth:v0650*
+ ID_VENDOR_FROM_DATABASE=Coravin, Inc.
+
+bluetooth:v0651*
+ ID_VENDOR_FROM_DATABASE=Stasis Labs, Inc.
+
+bluetooth:v0652*
+ ID_VENDOR_FROM_DATABASE=ITZ Innovations- und Technologiezentrum GmbH
+
+bluetooth:v0653*
+ ID_VENDOR_FROM_DATABASE=Meggitt SA
+
+bluetooth:v0654*
+ ID_VENDOR_FROM_DATABASE=Ledlenser GmbH & Co. KG
+
+bluetooth:v0655*
+ ID_VENDOR_FROM_DATABASE=Renishaw PLC
+
+bluetooth:v0656*
+ ID_VENDOR_FROM_DATABASE=ZhuHai AdvanPro Technology Company Limited
+
+bluetooth:v0657*
+ ID_VENDOR_FROM_DATABASE=Meshtronix Limited
+
+bluetooth:v0658*
+ ID_VENDOR_FROM_DATABASE=Payex Norge AS
+
+bluetooth:v0659*
+ ID_VENDOR_FROM_DATABASE=UnSeen Technologies Oy
+
+bluetooth:v065A*
+ ID_VENDOR_FROM_DATABASE=Zound Industries International AB
+
+bluetooth:v065B*
+ ID_VENDOR_FROM_DATABASE=Sesam Solutions BV
+
+bluetooth:v065C*
+ ID_VENDOR_FROM_DATABASE=PixArt Imaging Inc.
+
+bluetooth:v065D*
+ ID_VENDOR_FROM_DATABASE=Panduit Corp.
+
+bluetooth:v065E*
+ ID_VENDOR_FROM_DATABASE=Alo AB
+
+bluetooth:v065F*
+ ID_VENDOR_FROM_DATABASE=Ricoh Company Ltd
+
+bluetooth:v0660*
+ ID_VENDOR_FROM_DATABASE=RTC Industries, Inc.
+
+bluetooth:v0661*
+ ID_VENDOR_FROM_DATABASE=Mode Lighting Limited
+
+bluetooth:v0662*
+ ID_VENDOR_FROM_DATABASE=Particle Industries, Inc.
+
+bluetooth:v0663*
+ ID_VENDOR_FROM_DATABASE=Advanced Telemetry Systems, Inc.
+
+bluetooth:v0664*
+ ID_VENDOR_FROM_DATABASE=RHA TECHNOLOGIES LTD
+
+bluetooth:v0665*
+ ID_VENDOR_FROM_DATABASE=Pure International Limited
+
+bluetooth:v0666*
+ ID_VENDOR_FROM_DATABASE=WTO Werkzeug-Einrichtungen GmbH
+
+bluetooth:v0667*
+ ID_VENDOR_FROM_DATABASE=Spark Technology Labs Inc.
+
+bluetooth:v0668*
+ ID_VENDOR_FROM_DATABASE=Bleb Technology srl
+
+bluetooth:v0669*
+ ID_VENDOR_FROM_DATABASE=Livanova USA, Inc.
+
+bluetooth:v066A*
+ ID_VENDOR_FROM_DATABASE=Brady Worldwide Inc.
+
+bluetooth:v066B*
+ ID_VENDOR_FROM_DATABASE=DewertOkin GmbH
+
+bluetooth:v066C*
+ ID_VENDOR_FROM_DATABASE=Ztove ApS
+
+bluetooth:v066D*
+ ID_VENDOR_FROM_DATABASE=Venso EcoSolutions AB
+
+bluetooth:v066E*
+ ID_VENDOR_FROM_DATABASE=Eurotronik Kranj d.o.o.
+
+bluetooth:v066F*
+ ID_VENDOR_FROM_DATABASE=Hug Technology Ltd
+
+bluetooth:v0670*
+ ID_VENDOR_FROM_DATABASE=Gema Switzerland GmbH
+
+bluetooth:v0671*
+ ID_VENDOR_FROM_DATABASE=Buzz Products Ltd.
+
+bluetooth:v0672*
+ ID_VENDOR_FROM_DATABASE=Kopi
+
+bluetooth:v0673*
+ ID_VENDOR_FROM_DATABASE=Innova Ideas Limited
+
+bluetooth:v0674*
+ ID_VENDOR_FROM_DATABASE=BeSpoon
+
+bluetooth:v0675*
+ ID_VENDOR_FROM_DATABASE=Deco Enterprises, Inc.
+
+bluetooth:v0676*
+ ID_VENDOR_FROM_DATABASE=Expai Solutions Private Limited
+
+bluetooth:v0677*
+ ID_VENDOR_FROM_DATABASE=Innovation First, Inc.
+
+bluetooth:v0678*
+ ID_VENDOR_FROM_DATABASE=SABIK Offshore GmbH
+
+bluetooth:v0679*
+ ID_VENDOR_FROM_DATABASE=4iiii Innovations Inc.
+
+bluetooth:v067A*
+ ID_VENDOR_FROM_DATABASE=The Energy Conservatory, Inc.
+
+bluetooth:v067B*
+ ID_VENDOR_FROM_DATABASE=I.FARM, INC.
+
+bluetooth:v067C*
+ ID_VENDOR_FROM_DATABASE=Tile, Inc.
+
+bluetooth:v067D*
+ ID_VENDOR_FROM_DATABASE=Form Athletica Inc.
+
+bluetooth:v067E*
+ ID_VENDOR_FROM_DATABASE=MbientLab Inc
+
+bluetooth:v067F*
+ ID_VENDOR_FROM_DATABASE=NETGRID S.N.C. DI BISSOLI MATTEO, CAMPOREALE SIMONE, TOGNETTI FEDERICO
+
+bluetooth:v0680*
+ ID_VENDOR_FROM_DATABASE=Mannkind Corporation
+
+bluetooth:v0681*
+ ID_VENDOR_FROM_DATABASE=Trade FIDES a.s.
+
+bluetooth:v0682*
+ ID_VENDOR_FROM_DATABASE=Photron Limited
+
+bluetooth:v0683*
+ ID_VENDOR_FROM_DATABASE=Eltako GmbH
+
+bluetooth:v0684*
+ ID_VENDOR_FROM_DATABASE=Dermalapps, LLC
+
+bluetooth:v0685*
+ ID_VENDOR_FROM_DATABASE=Greenwald Industries
+
+bluetooth:v0686*
+ ID_VENDOR_FROM_DATABASE=inQs Co., Ltd.
+
+bluetooth:v0687*
+ ID_VENDOR_FROM_DATABASE=Cherry GmbH
+
+bluetooth:v0688*
+ ID_VENDOR_FROM_DATABASE=Amsted Digital Solutions Inc.
+
+bluetooth:v0689*
+ ID_VENDOR_FROM_DATABASE=Tacx b.v.
+
+bluetooth:v068A*
+ ID_VENDOR_FROM_DATABASE=Raytac Corporation
+
+bluetooth:v068B*
+ ID_VENDOR_FROM_DATABASE=Jiangsu Teranovo Tech Co., Ltd.
+
+bluetooth:v068C*
+ ID_VENDOR_FROM_DATABASE=Changzhou Sound Dragon Electronics and Acoustics Co., Ltd
+
+bluetooth:v068D*
+ ID_VENDOR_FROM_DATABASE=JetBeep Inc.
+
+bluetooth:v068E*
+ ID_VENDOR_FROM_DATABASE=Razer Inc.
+
+bluetooth:v068F*
+ ID_VENDOR_FROM_DATABASE=JRM Group Limited
+
+bluetooth:v0690*
+ ID_VENDOR_FROM_DATABASE=Eccrine Systems, Inc.
+
+bluetooth:v0691*
+ ID_VENDOR_FROM_DATABASE=Curie Point AB
+
+bluetooth:v0692*
+ ID_VENDOR_FROM_DATABASE=Georg Fischer AG
+
+bluetooth:v0693*
+ ID_VENDOR_FROM_DATABASE=Hach - Danaher
+
+bluetooth:v0694*
+ ID_VENDOR_FROM_DATABASE=T&A Laboratories LLC
+
+bluetooth:v0695*
+ ID_VENDOR_FROM_DATABASE=Koki Holdings Co., Ltd.
+
+bluetooth:v0696*
+ ID_VENDOR_FROM_DATABASE=Gunakar Private Limited
+
+bluetooth:v0697*
+ ID_VENDOR_FROM_DATABASE=Stemco Products Inc
+
+bluetooth:v0698*
+ ID_VENDOR_FROM_DATABASE=Wood IT Security, LLC
+
+bluetooth:v0699*
+ ID_VENDOR_FROM_DATABASE=RandomLab SAS
+
+bluetooth:v069A*
+ ID_VENDOR_FROM_DATABASE=Adero, Inc. (formerly as TrackR, Inc.)
+
+bluetooth:v069B*
+ ID_VENDOR_FROM_DATABASE=Dragonchip Limited
+
+bluetooth:v069C*
+ ID_VENDOR_FROM_DATABASE=Noomi AB
+
+bluetooth:v069D*
+ ID_VENDOR_FROM_DATABASE=Vakaros LLC
+
+bluetooth:v069E*
+ ID_VENDOR_FROM_DATABASE=Delta Electronics, Inc.
+
+bluetooth:v069F*
+ ID_VENDOR_FROM_DATABASE=FlowMotion Technologies AS
+
+bluetooth:v06A0*
+ ID_VENDOR_FROM_DATABASE=OBIQ Location Technology Inc.
+
+bluetooth:v06A1*
+ ID_VENDOR_FROM_DATABASE=Cardo Systems, Ltd
+
+bluetooth:v06A2*
+ ID_VENDOR_FROM_DATABASE=Globalworx GmbH
+
+bluetooth:v06A3*
+ ID_VENDOR_FROM_DATABASE=Nymbus, LLC
+
+bluetooth:v06A4*
+ ID_VENDOR_FROM_DATABASE=Sanyo Techno Solutions Tottori Co., Ltd.
+
+bluetooth:v06A5*
+ ID_VENDOR_FROM_DATABASE=TEKZITEL PTY LTD
+
+bluetooth:v06A6*
+ ID_VENDOR_FROM_DATABASE=Roambee Corporation
+
+bluetooth:v06A7*
+ ID_VENDOR_FROM_DATABASE=Chipsea Technologies (ShenZhen) Corp.
+
+bluetooth:v06A8*
+ ID_VENDOR_FROM_DATABASE=GD Midea Air-Conditioning Equipment Co., Ltd.
+
+bluetooth:v06A9*
+ ID_VENDOR_FROM_DATABASE=Soundmax Electronics Limited
+
+bluetooth:v06AA*
+ ID_VENDOR_FROM_DATABASE=Produal Oy
+
+bluetooth:v06AB*
+ ID_VENDOR_FROM_DATABASE=HMS Industrial Networks AB
+
+bluetooth:v06AC*
+ ID_VENDOR_FROM_DATABASE=Ingchips Technology Co., Ltd.
+
+bluetooth:v06AD*
+ ID_VENDOR_FROM_DATABASE=InnovaSea Systems Inc.
+
+bluetooth:v06AE*
+ ID_VENDOR_FROM_DATABASE=SenseQ Inc.
+
+bluetooth:v06AF*
+ ID_VENDOR_FROM_DATABASE=Shoof Technologies
+
+bluetooth:v06B0*
+ ID_VENDOR_FROM_DATABASE=BRK Brands, Inc.
+
+bluetooth:v06B1*
+ ID_VENDOR_FROM_DATABASE=SimpliSafe, Inc.
+
+bluetooth:v06B2*
+ ID_VENDOR_FROM_DATABASE=Tussock Innovation 2013 Limited
+
+bluetooth:v06B3*
+ ID_VENDOR_FROM_DATABASE=The Hablab ApS
+
+bluetooth:v06B4*
+ ID_VENDOR_FROM_DATABASE=Sencilion Oy
+
+bluetooth:v06B5*
+ ID_VENDOR_FROM_DATABASE=Wabilogic Ltd.
+
+bluetooth:v06B6*
+ ID_VENDOR_FROM_DATABASE=Sociometric Solutions, Inc.
+
+bluetooth:v06B7*
+ ID_VENDOR_FROM_DATABASE=iCOGNIZE GmbH
+
+bluetooth:v06B8*
+ ID_VENDOR_FROM_DATABASE=ShadeCraft, Inc
+
+bluetooth:v06B9*
+ ID_VENDOR_FROM_DATABASE=Beflex Inc.
+
+bluetooth:v06BA*
+ ID_VENDOR_FROM_DATABASE=Beaconzone Ltd
+
+bluetooth:v06BB*
+ ID_VENDOR_FROM_DATABASE=Leaftronix Analogic Solutions Private Limited
+
+bluetooth:v06BC*
+ ID_VENDOR_FROM_DATABASE=TWS Srl
+
+bluetooth:v06BD*
+ ID_VENDOR_FROM_DATABASE=ABB Oy
+
+bluetooth:v06BE*
+ ID_VENDOR_FROM_DATABASE=HitSeed Oy
+
+bluetooth:v06BF*
+ ID_VENDOR_FROM_DATABASE=Delcom Products Inc.
+
+bluetooth:v06C0*
+ ID_VENDOR_FROM_DATABASE=CAME S.p.A.
+
+bluetooth:v06C1*
+ ID_VENDOR_FROM_DATABASE=Alarm.com Holdings, Inc
+
+bluetooth:v06C2*
+ ID_VENDOR_FROM_DATABASE=Measurlogic Inc.
+
+bluetooth:v06C3*
+ ID_VENDOR_FROM_DATABASE=King I Electronics.Co.,Ltd
+
+bluetooth:v06C4*
+ ID_VENDOR_FROM_DATABASE=Dream Labs GmbH
+
+bluetooth:v06C5*
+ ID_VENDOR_FROM_DATABASE=Urban Compass, Inc
+
+bluetooth:v06C6*
+ ID_VENDOR_FROM_DATABASE=Simm Tronic Limited
+
+bluetooth:v06C7*
+ ID_VENDOR_FROM_DATABASE=Somatix Inc
+
+bluetooth:v06C8*
+ ID_VENDOR_FROM_DATABASE=Storz & Bickel GmbH & Co. KG
+
+bluetooth:v06C9*
+ ID_VENDOR_FROM_DATABASE=MYLAPS B.V.
+
+bluetooth:v06CA*
+ ID_VENDOR_FROM_DATABASE=Shenzhen Zhongguang Infotech Technology Development Co., Ltd
+
+bluetooth:v06CB*
+ ID_VENDOR_FROM_DATABASE=Dyeware, LLC
+
+bluetooth:v06CC*
+ ID_VENDOR_FROM_DATABASE=Dongguan SmartAction Technology Co.,Ltd.
+
+bluetooth:v06CD*
+ ID_VENDOR_FROM_DATABASE=DIG Corporation
+
+bluetooth:v06CE*
+ ID_VENDOR_FROM_DATABASE=FIOR & GENTZ
+
+bluetooth:v06CF*
+ ID_VENDOR_FROM_DATABASE=Belparts N.V.
+
+bluetooth:v06D0*
+ ID_VENDOR_FROM_DATABASE=Etekcity Corporation
+
+bluetooth:v06D1*
+ ID_VENDOR_FROM_DATABASE=Meyer Sound Laboratories, Incorporated
+
+bluetooth:v06D2*
+ ID_VENDOR_FROM_DATABASE=CeoTronics AG
+
+bluetooth:v06D3*
+ ID_VENDOR_FROM_DATABASE=TriTeq Lock and Security, LLC
+
+bluetooth:v06D4*
+ ID_VENDOR_FROM_DATABASE=DYNAKODE TECHNOLOGY PRIVATE LIMITED
+
+bluetooth:v06D5*
+ ID_VENDOR_FROM_DATABASE=Sensirion AG
+
+bluetooth:v06D6*
+ ID_VENDOR_FROM_DATABASE=JCT Healthcare Pty Ltd
+
+bluetooth:v06D7*
+ ID_VENDOR_FROM_DATABASE=FUBA Automotive Electronics GmbH
+
+bluetooth:v06D8*
+ ID_VENDOR_FROM_DATABASE=AW Company
+
+bluetooth:v06D9*
+ ID_VENDOR_FROM_DATABASE=Shanghai Mountain View Silicon Co.,Ltd.
+
+bluetooth:v06DA*
+ ID_VENDOR_FROM_DATABASE=Zliide Technologies ApS
+
+bluetooth:v06DB*
+ ID_VENDOR_FROM_DATABASE=Automatic Labs, Inc.
+
+bluetooth:v06DC*
+ ID_VENDOR_FROM_DATABASE=Industrial Network Controls, LLC
+
+bluetooth:v06DD*
+ ID_VENDOR_FROM_DATABASE=Intellithings Ltd.
+
+bluetooth:v06DE*
+ ID_VENDOR_FROM_DATABASE=Navcast, Inc.
+
+bluetooth:v06DF*
+ ID_VENDOR_FROM_DATABASE=Hubbell Lighting, Inc.
+
+bluetooth:v06E0*
+ ID_VENDOR_FROM_DATABASE=Avaya
+
+bluetooth:v06E1*
+ ID_VENDOR_FROM_DATABASE=Milestone AV Technologies LLC
+
+bluetooth:v06E2*
+ ID_VENDOR_FROM_DATABASE=Alango Technologies Ltd
+
+bluetooth:v06E3*
+ ID_VENDOR_FROM_DATABASE=Spinlock Ltd
+
+bluetooth:v06E4*
+ ID_VENDOR_FROM_DATABASE=Aluna
+
+bluetooth:v06E5*
+ ID_VENDOR_FROM_DATABASE=OPTEX CO.,LTD.
+
+bluetooth:v06E6*
+ ID_VENDOR_FROM_DATABASE=NIHON DENGYO KOUSAKU
+
+bluetooth:v06E7*
+ ID_VENDOR_FROM_DATABASE=VELUX A/S
+
+bluetooth:v06E8*
+ ID_VENDOR_FROM_DATABASE=Almendo Technologies GmbH
+
+bluetooth:v06E9*
+ ID_VENDOR_FROM_DATABASE=Zmartfun Electronics, Inc.
+
+bluetooth:v06EA*
+ ID_VENDOR_FROM_DATABASE=SafeLine Sweden AB
+
+bluetooth:v06EB*
+ ID_VENDOR_FROM_DATABASE=Houston Radar LLC
+
+bluetooth:v06EC*
+ ID_VENDOR_FROM_DATABASE=Sigur
+
+bluetooth:v06ED*
+ ID_VENDOR_FROM_DATABASE=J Neades Ltd
+
+bluetooth:v06EE*
+ ID_VENDOR_FROM_DATABASE=Avantis Systems Limited
+
+bluetooth:v06EF*
+ ID_VENDOR_FROM_DATABASE=ALCARE Co., Ltd.
+
+bluetooth:v06F0*
+ ID_VENDOR_FROM_DATABASE=Chargy Technologies, SL
+
+bluetooth:v06F1*
+ ID_VENDOR_FROM_DATABASE=Shibutani Co., Ltd.
+
+bluetooth:v06F2*
+ ID_VENDOR_FROM_DATABASE=Trapper Data AB
+
+bluetooth:v06F3*
+ ID_VENDOR_FROM_DATABASE=Alfred International Inc.
+
+bluetooth:v06F4*
+ ID_VENDOR_FROM_DATABASE=Near Field Solutions Ltd
+
+bluetooth:v06F5*
+ ID_VENDOR_FROM_DATABASE=Vigil Technologies Inc.
+
+bluetooth:v06F6*
+ ID_VENDOR_FROM_DATABASE=Vitulo Plus BV
+
+bluetooth:v06F7*
+ ID_VENDOR_FROM_DATABASE=WILKA Schliesstechnik GmbH
+
+bluetooth:v06F8*
+ ID_VENDOR_FROM_DATABASE=BodyPlus Technology Co.,Ltd
+
+bluetooth:v06F9*
+ ID_VENDOR_FROM_DATABASE=happybrush GmbH
+
+bluetooth:v06FA*
+ ID_VENDOR_FROM_DATABASE=Enequi AB
+
+bluetooth:v06FB*
+ ID_VENDOR_FROM_DATABASE=Sartorius AG
+
+bluetooth:v06FC*
+ ID_VENDOR_FROM_DATABASE=Tom Communication Industrial Co.,Ltd.
+
+bluetooth:v06FD*
+ ID_VENDOR_FROM_DATABASE=ESS Embedded System Solutions Inc.
+
+bluetooth:v06FE*
+ ID_VENDOR_FROM_DATABASE=Mahr GmbH
+
+bluetooth:v06FF*
+ ID_VENDOR_FROM_DATABASE=Redpine Signals Inc
+
+bluetooth:v0700*
+ ID_VENDOR_FROM_DATABASE=TraqFreq LLC
+
+bluetooth:v0701*
+ ID_VENDOR_FROM_DATABASE=PAFERS TECH
+
+bluetooth:v0702*
+ ID_VENDOR_FROM_DATABASE=Akciju sabiedriba "SAF TEHNIKA"
+
+bluetooth:v0703*
+ ID_VENDOR_FROM_DATABASE=Beijing Jingdong Century Trading Co., Ltd.
+
+bluetooth:v0704*
+ ID_VENDOR_FROM_DATABASE=JBX Designs Inc.
+
+bluetooth:v0705*
+ ID_VENDOR_FROM_DATABASE=AB Electrolux
+
+bluetooth:v0706*
+ ID_VENDOR_FROM_DATABASE=Wernher von Braun Center for ASdvanced Research
+
+bluetooth:v0707*
+ ID_VENDOR_FROM_DATABASE=Essity Hygiene and Health Aktiebolag
+
+bluetooth:v0708*
+ ID_VENDOR_FROM_DATABASE=Be Interactive Co., Ltd
+
+bluetooth:v0709*
+ ID_VENDOR_FROM_DATABASE=Carewear Corp.
+
+bluetooth:v070A*
+ ID_VENDOR_FROM_DATABASE=Huf Hülsbeck & Fürst GmbH & Co. KG
+
+bluetooth:v070B*
+ ID_VENDOR_FROM_DATABASE=Element Products, Inc.
+
+bluetooth:v070C*
+ ID_VENDOR_FROM_DATABASE=Beijing Winner Microelectronics Co.,Ltd
+
+bluetooth:v070D*
+ ID_VENDOR_FROM_DATABASE=SmartSnugg Pty Ltd
+
+bluetooth:v070E*
+ ID_VENDOR_FROM_DATABASE=FiveCo Sarl
+
+bluetooth:v070F*
+ ID_VENDOR_FROM_DATABASE=California Things Inc.
+
+bluetooth:v0710*
+ ID_VENDOR_FROM_DATABASE=Audiodo AB
+
+bluetooth:v0711*
+ ID_VENDOR_FROM_DATABASE=ABAX AS
+
+bluetooth:v0712*
+ ID_VENDOR_FROM_DATABASE=Bull Group Company Limited
+
+bluetooth:v0713*
+ ID_VENDOR_FROM_DATABASE=Respiri Limited
+
+bluetooth:v0714*
+ ID_VENDOR_FROM_DATABASE=MindPeace Safety LLC
+
+bluetooth:v0715*
+ ID_VENDOR_FROM_DATABASE=Vgyan Solutions
+
+bluetooth:v0716*
+ ID_VENDOR_FROM_DATABASE=Altonics
+
+bluetooth:v0717*
+ ID_VENDOR_FROM_DATABASE=iQsquare BV
+
+bluetooth:v0718*
+ ID_VENDOR_FROM_DATABASE=IDIBAIX enginneering
+
+bluetooth:v0719*
+ ID_VENDOR_FROM_DATABASE=ECSG
+
+bluetooth:v071A*
+ ID_VENDOR_FROM_DATABASE=REVSMART WEARABLE HK CO LTD
+
+bluetooth:v071B*
+ ID_VENDOR_FROM_DATABASE=Precor
+
+bluetooth:v071C*
+ ID_VENDOR_FROM_DATABASE=F5 Sports, Inc
+
+bluetooth:v071D*
+ ID_VENDOR_FROM_DATABASE=exoTIC Systems
+
+bluetooth:v071E*
+ ID_VENDOR_FROM_DATABASE=DONGGUAN HELE ELECTRONICS CO., LTD
+
+bluetooth:v071F*
+ ID_VENDOR_FROM_DATABASE=Dongguan Liesheng Electronic Co.Ltd
+
+bluetooth:v0720*
+ ID_VENDOR_FROM_DATABASE=Oculeve, Inc.
+
+bluetooth:v0721*
+ ID_VENDOR_FROM_DATABASE=Clover Network, Inc.
+
+bluetooth:v0722*
+ ID_VENDOR_FROM_DATABASE=Xiamen Eholder Electronics Co.Ltd
+
+bluetooth:v0723*
+ ID_VENDOR_FROM_DATABASE=Ford Motor Company
+
+bluetooth:v0724*
+ ID_VENDOR_FROM_DATABASE=Guangzhou SuperSound Information Technology Co.,Ltd
+
+bluetooth:v0725*
+ ID_VENDOR_FROM_DATABASE=Tedee Sp. z o.o.
+
+bluetooth:v0726*
+ ID_VENDOR_FROM_DATABASE=PHC Corporation
+
+bluetooth:v0727*
+ ID_VENDOR_FROM_DATABASE=STALKIT AS
+
+bluetooth:v0728*
+ ID_VENDOR_FROM_DATABASE=Eli Lilly and Company
+
+bluetooth:v0729*
+ ID_VENDOR_FROM_DATABASE=SwaraLink Technologies
+
+bluetooth:v072A*
+ ID_VENDOR_FROM_DATABASE=JMR embedded systems GmbH
+
+bluetooth:v072B*
+ ID_VENDOR_FROM_DATABASE=Bitkey Inc.
+
+bluetooth:v072C*
+ ID_VENDOR_FROM_DATABASE=GWA Hygiene GmbH
+
+bluetooth:v072D*
+ ID_VENDOR_FROM_DATABASE=Safera Oy
+
+bluetooth:v072E*
+ ID_VENDOR_FROM_DATABASE=Open Platform Systems LLC
+
+bluetooth:v072F*
+ ID_VENDOR_FROM_DATABASE=OnePlus Electronics (Shenzhen) Co., Ltd.
+
+bluetooth:v0730*
+ ID_VENDOR_FROM_DATABASE=Wildlife Acoustics, Inc.
+
+bluetooth:v0731*
+ ID_VENDOR_FROM_DATABASE=ABLIC Inc.
+
+bluetooth:v0732*
+ ID_VENDOR_FROM_DATABASE=Dairy Tech, Inc.
+
+bluetooth:v0733*
+ ID_VENDOR_FROM_DATABASE=Iguanavation, Inc.
+
+bluetooth:v0734*
+ ID_VENDOR_FROM_DATABASE=DiUS Computing Pty Ltd
+
+bluetooth:v0735*
+ ID_VENDOR_FROM_DATABASE=UpRight Technologies LTD
+
+bluetooth:v0736*
+ ID_VENDOR_FROM_DATABASE=FrancisFund, LLC
+
+bluetooth:v0737*
+ ID_VENDOR_FROM_DATABASE=LLC Navitek
+
+bluetooth:v0738*
+ ID_VENDOR_FROM_DATABASE=Glass Security Pte Ltd
+
+bluetooth:v0739*
+ ID_VENDOR_FROM_DATABASE=Jiangsu Qinheng Co., Ltd.
+
+bluetooth:v073A*
+ ID_VENDOR_FROM_DATABASE=Chandler Systems Inc.
+
+bluetooth:v073B*
+ ID_VENDOR_FROM_DATABASE=Fantini Cosmi s.p.a.
+
+bluetooth:v073C*
+ ID_VENDOR_FROM_DATABASE=Acubit ApS
+
+bluetooth:v073D*
+ ID_VENDOR_FROM_DATABASE=Beijing Hao Heng Tian Tech Co., Ltd.
+
+bluetooth:v073E*
+ ID_VENDOR_FROM_DATABASE=Bluepack S.R.L.
+
+bluetooth:v073F*
+ ID_VENDOR_FROM_DATABASE=Beijing Unisoc Technologies Co., Ltd.
+
+bluetooth:v0740*
+ ID_VENDOR_FROM_DATABASE=HITIQ LIMITED
+
+bluetooth:v0741*
+ ID_VENDOR_FROM_DATABASE=MAC SRL
+
+bluetooth:v0742*
+ ID_VENDOR_FROM_DATABASE=DML LLC
+
+bluetooth:v0743*
+ ID_VENDOR_FROM_DATABASE=Sanofi
+
+bluetooth:v0744*
+ ID_VENDOR_FROM_DATABASE=SOCOMEC
+
+bluetooth:v0745*
+ ID_VENDOR_FROM_DATABASE=WIZNOVA, Inc.
+
+bluetooth:v0746*
+ ID_VENDOR_FROM_DATABASE=Seitec Elektronik GmbH
+
+bluetooth:v0747*
+ ID_VENDOR_FROM_DATABASE=OR Technologies Pty Ltd
+
+bluetooth:v0748*
+ ID_VENDOR_FROM_DATABASE=GuangZhou KuGou Computer Technology Co.Ltd
+
+bluetooth:v0749*
+ ID_VENDOR_FROM_DATABASE=DIAODIAO (Beijing) Technology Co., Ltd.
+
+bluetooth:v074A*
+ ID_VENDOR_FROM_DATABASE=Illusory Studios LLC
+
+bluetooth:v074B*
+ ID_VENDOR_FROM_DATABASE=Sarvavid Software Solutions LLP
+
+bluetooth:v074C*
+ ID_VENDOR_FROM_DATABASE=iopool s.a.
+
+bluetooth:v074D*
+ ID_VENDOR_FROM_DATABASE=Amtech Systems, LLC
+
+bluetooth:v074E*
+ ID_VENDOR_FROM_DATABASE=EAGLE DETECTION SA
+
+bluetooth:v074F*
+ ID_VENDOR_FROM_DATABASE=MEDIATECH S.R.L.
+
+bluetooth:v0750*
+ ID_VENDOR_FROM_DATABASE=Hamilton Professional Services of Canada Incorporated
+
+bluetooth:v0751*
+ ID_VENDOR_FROM_DATABASE=Changsha JEMO IC Design Co.,Ltd
+
+bluetooth:v0752*
+ ID_VENDOR_FROM_DATABASE=Elatec GmbH
+
+bluetooth:v0753*
+ ID_VENDOR_FROM_DATABASE=JLG Industries, Inc.
+
+bluetooth:v0754*
+ ID_VENDOR_FROM_DATABASE=Michael Parkin
+
+bluetooth:v0755*
+ ID_VENDOR_FROM_DATABASE=Brother Industries, Ltd
+
+bluetooth:v0756*
+ ID_VENDOR_FROM_DATABASE=Lumens For Less, Inc
+
+bluetooth:v0757*
+ ID_VENDOR_FROM_DATABASE=ELA Innovation
+
+bluetooth:v0758*
+ ID_VENDOR_FROM_DATABASE=umanSense AB
+
+bluetooth:v0759*
+ ID_VENDOR_FROM_DATABASE=Shanghai InGeek Cyber Security Co., Ltd.
+
+bluetooth:v075A*
+ ID_VENDOR_FROM_DATABASE=HARMAN CO.,LTD.
+
+bluetooth:v075B*
+ ID_VENDOR_FROM_DATABASE=Smart Sensor Devices AB
+
+bluetooth:v075C*
+ ID_VENDOR_FROM_DATABASE=Antitronics Inc.
+
+bluetooth:v075D*
+ ID_VENDOR_FROM_DATABASE=RHOMBUS SYSTEMS, INC.
+
+bluetooth:v075E*
+ ID_VENDOR_FROM_DATABASE=Katerra Inc.
+
+bluetooth:v075F*
+ ID_VENDOR_FROM_DATABASE=Remote Solution Co., LTD.
+
+bluetooth:v0760*
+ ID_VENDOR_FROM_DATABASE=Vimar SpA
+
+bluetooth:v0761*
+ ID_VENDOR_FROM_DATABASE=Mantis Tech LLC
+
+bluetooth:v0762*
+ ID_VENDOR_FROM_DATABASE=TerOpta Ltd
+
+bluetooth:v0763*
+ ID_VENDOR_FROM_DATABASE=PIKOLIN S.L.
+
+bluetooth:v0764*
+ ID_VENDOR_FROM_DATABASE=WWZN Information Technology Company Limited
+
+bluetooth:v0765*
+ ID_VENDOR_FROM_DATABASE=Voxx International
+
+bluetooth:v0766*
+ ID_VENDOR_FROM_DATABASE=ART AND PROGRAM, INC.
+
+bluetooth:v0767*
+ ID_VENDOR_FROM_DATABASE=NITTO DENKO ASIA TECHNICAL CENTRE PTE. LTD.
+
+bluetooth:v0768*
+ ID_VENDOR_FROM_DATABASE=Peloton Interactive Inc.
+
+bluetooth:v0769*
+ ID_VENDOR_FROM_DATABASE=Force Impact Technologies
+
+bluetooth:v076A*
+ ID_VENDOR_FROM_DATABASE=Dmac Mobile Developments, LLC
+
+bluetooth:v076B*
+ ID_VENDOR_FROM_DATABASE=Engineered Medical Technologies
+
+bluetooth:v076C*
+ ID_VENDOR_FROM_DATABASE=Noodle Technology inc
+
+bluetooth:v076D*
+ ID_VENDOR_FROM_DATABASE=Graesslin GmbH
+
+bluetooth:v076E*
+ ID_VENDOR_FROM_DATABASE=WuQi technologies, Inc.
+
+bluetooth:v076F*
+ ID_VENDOR_FROM_DATABASE=Successful Endeavours Pty Ltd
+
+bluetooth:v0770*
+ ID_VENDOR_FROM_DATABASE=InnoCon Medical ApS
+
+bluetooth:v0771*
+ ID_VENDOR_FROM_DATABASE=Corvex Connected Safety
+
+bluetooth:v0772*
+ ID_VENDOR_FROM_DATABASE=Thirdwayv Inc.
+
+bluetooth:v0773*
+ ID_VENDOR_FROM_DATABASE=Echoflex Solutions Inc.
+
+bluetooth:v0774*
+ ID_VENDOR_FROM_DATABASE=C-MAX Asia Limited
+
+bluetooth:v0775*
+ ID_VENDOR_FROM_DATABASE=4eBusiness GmbH
+
+bluetooth:v0776*
+ ID_VENDOR_FROM_DATABASE=Cyber Transport Control GmbH
+
+bluetooth:v0777*
+ ID_VENDOR_FROM_DATABASE=Cue
+
+bluetooth:v0778*
+ ID_VENDOR_FROM_DATABASE=KOAMTAC INC.
+
+bluetooth:v0779*
+ ID_VENDOR_FROM_DATABASE=Loopshore Oy
+
+bluetooth:v077A*
+ ID_VENDOR_FROM_DATABASE=Niruha Systems Private Limited
+
+bluetooth:v077B*
+ ID_VENDOR_FROM_DATABASE=AmaterZ, Inc.
+
+bluetooth:v077C*
+ ID_VENDOR_FROM_DATABASE=radius co., ltd.
+
+bluetooth:v077D*
+ ID_VENDOR_FROM_DATABASE=Sensority, s.r.o.
+
+bluetooth:v077E*
+ ID_VENDOR_FROM_DATABASE=Sparkage Inc.
+
+bluetooth:v077F*
+ ID_VENDOR_FROM_DATABASE=Glenview Software Corporation
+
+bluetooth:v0780*
+ ID_VENDOR_FROM_DATABASE=Finch Technologies Ltd.
+
+bluetooth:v0781*
+ ID_VENDOR_FROM_DATABASE=Qingping Technology (Beijing) Co., Ltd.
+
+bluetooth:v0782*
+ ID_VENDOR_FROM_DATABASE=DeviceDrive AS
+
+bluetooth:v0783*
+ ID_VENDOR_FROM_DATABASE=ESEMBER LIMITED LIABILITY COMPANY
+
+bluetooth:v0784*
+ ID_VENDOR_FROM_DATABASE=audifon GmbH & Co. KG
+
+bluetooth:v0785*
+ ID_VENDOR_FROM_DATABASE=O2 Micro, Inc.
+
+bluetooth:v0786*
+ ID_VENDOR_FROM_DATABASE=HLP Controls Pty Limited
+
+bluetooth:v0787*
+ ID_VENDOR_FROM_DATABASE=Pangaea Solution
+
+bluetooth:v0788*
+ ID_VENDOR_FROM_DATABASE=BubblyNet, LLC
+
+bluetooth:v078A*
+ ID_VENDOR_FROM_DATABASE=The Wildflower Foundation
+
+bluetooth:v078B*
+ ID_VENDOR_FROM_DATABASE=Optikam Tech Inc.
+
+bluetooth:v078C*
+ ID_VENDOR_FROM_DATABASE=MINIBREW HOLDING B.V
+
+bluetooth:v078D*
+ ID_VENDOR_FROM_DATABASE=Cybex GmbH
+
+bluetooth:v078E*
+ ID_VENDOR_FROM_DATABASE=FUJIMIC NIIGATA, INC.
+
+bluetooth:v078F*
+ ID_VENDOR_FROM_DATABASE=Hanna Instruments, Inc.
+
+bluetooth:v0790*
+ ID_VENDOR_FROM_DATABASE=KOMPAN A/S
+
+bluetooth:v0791*
+ ID_VENDOR_FROM_DATABASE=Scosche Industries, Inc.
+
+bluetooth:v0792*
+ ID_VENDOR_FROM_DATABASE=Provo Craft
+
+bluetooth:v0793*
+ ID_VENDOR_FROM_DATABASE=AEV spol. s r.o.
+
+bluetooth:v0794*
+ ID_VENDOR_FROM_DATABASE=The Coca-Cola Company
+
+bluetooth:v0795*
+ ID_VENDOR_FROM_DATABASE=GASTEC CORPORATION
+
+bluetooth:v0796*
+ ID_VENDOR_FROM_DATABASE=StarLeaf Ltd
+
+bluetooth:v0797*
+ ID_VENDOR_FROM_DATABASE=Water-i.d. GmbH
+
+bluetooth:v0798*
+ ID_VENDOR_FROM_DATABASE=HoloKit, Inc.
+
+bluetooth:v0799*
+ ID_VENDOR_FROM_DATABASE=PlantChoir Inc.
+
+bluetooth:v079A*
+ ID_VENDOR_FROM_DATABASE=GuangDong Oppo Mobile Telecommunications Corp., Ltd.
+
+bluetooth:v079B*
+ ID_VENDOR_FROM_DATABASE=CST ELECTRONICS (PROPRIETARY) LIMITED
+
+bluetooth:v079C*
+ ID_VENDOR_FROM_DATABASE=Sky UK Limited
+
+bluetooth:v079D*
+ ID_VENDOR_FROM_DATABASE=Digibale Pty Ltd
+
+bluetooth:v079E*
+ ID_VENDOR_FROM_DATABASE=Smartloxx GmbH
+
+bluetooth:v079F*
+ ID_VENDOR_FROM_DATABASE=Pune Scientific LLP
+
+bluetooth:v07A0*
+ ID_VENDOR_FROM_DATABASE=Regent Beleuchtungskorper AG
+
+bluetooth:v07A1*
+ ID_VENDOR_FROM_DATABASE=Apollo Neuroscience, Inc.
+
+bluetooth:v07A2*
+ ID_VENDOR_FROM_DATABASE=Roku, Inc.
+
+bluetooth:v07A3*
+ ID_VENDOR_FROM_DATABASE=Comcast Cable
+
+bluetooth:v07A4*
+ ID_VENDOR_FROM_DATABASE=Xiamen Mage Information Technology Co., Ltd.
+
+bluetooth:v07A5*
+ ID_VENDOR_FROM_DATABASE=RAB Lighting, Inc.
+
+bluetooth:v07A6*
+ ID_VENDOR_FROM_DATABASE=Musen Connect, Inc.
+
+bluetooth:v07A7*
+ ID_VENDOR_FROM_DATABASE=Zume, Inc.
+
+bluetooth:v07A8*
+ ID_VENDOR_FROM_DATABASE=conbee GmbH
+
+bluetooth:v07A9*
+ ID_VENDOR_FROM_DATABASE=Bruel & Kjaer Sound & Vibration
+
+bluetooth:v07AA*
+ ID_VENDOR_FROM_DATABASE=The Kroger Co.
+
+bluetooth:v07AB*
+ ID_VENDOR_FROM_DATABASE=Granite River Solutions, Inc.
+
+bluetooth:v07AC*
+ ID_VENDOR_FROM_DATABASE=LoupeDeck Oy
+
+bluetooth:v07AD*
+ ID_VENDOR_FROM_DATABASE=New H3C Technologies Co.,Ltd
+
+bluetooth:v07AE*
+ ID_VENDOR_FROM_DATABASE=Aurea Solucoes Tecnologicas Ltda.
+
+bluetooth:v07AF*
+ ID_VENDOR_FROM_DATABASE=Hong Kong Bouffalo Lab Limited
+
+bluetooth:v07B0*
+ ID_VENDOR_FROM_DATABASE=GV Concepts Inc.
+
+bluetooth:v07B1*
+ ID_VENDOR_FROM_DATABASE=Thomas Dynamics, LLC
+
+bluetooth:v07B2*
+ ID_VENDOR_FROM_DATABASE=Moeco IOT Inc.
+
+bluetooth:v07B3*
+ ID_VENDOR_FROM_DATABASE=2N TELEKOMUNIKACE a.s.
+
+bluetooth:v07B4*
+ ID_VENDOR_FROM_DATABASE=Hormann KG Antriebstechnik
+
+bluetooth:v07B5*
+ ID_VENDOR_FROM_DATABASE=CRONO CHIP, S.L.
+
+bluetooth:v07B6*
+ ID_VENDOR_FROM_DATABASE=Soundbrenner Limited
+
+bluetooth:v07B7*
+ ID_VENDOR_FROM_DATABASE=ETABLISSEMENTS GEORGES RENAULT
+
+bluetooth:v07B8*
+ ID_VENDOR_FROM_DATABASE=iSwip
+
+bluetooth:v07B9*
+ ID_VENDOR_FROM_DATABASE=Epona Biotec Limited
+
+bluetooth:v07BA*
+ ID_VENDOR_FROM_DATABASE=Battery-Biz Inc.
+
+bluetooth:v07BB*
+ ID_VENDOR_FROM_DATABASE=EPIC S.R.L.
+
+bluetooth:v07BC*
+ ID_VENDOR_FROM_DATABASE=KD CIRCUITS LLC
+
+bluetooth:v07BD*
+ ID_VENDOR_FROM_DATABASE=Genedrive Diagnostics Ltd
+
+bluetooth:v07BE*
+ ID_VENDOR_FROM_DATABASE=Axentia Technologies AB
+
+bluetooth:v07BF*
+ ID_VENDOR_FROM_DATABASE=REGULA Ltd.
+
+bluetooth:v07C0*
+ ID_VENDOR_FROM_DATABASE=Biral AG
+
+bluetooth:v07C1*
+ ID_VENDOR_FROM_DATABASE=A.W. Chesterton Company
+
+bluetooth:v07C2*
+ ID_VENDOR_FROM_DATABASE=Radinn AB
+
+bluetooth:v07C3*
+ ID_VENDOR_FROM_DATABASE=CIMTechniques, Inc.
+
+bluetooth:v07C4*
+ ID_VENDOR_FROM_DATABASE=Johnson Health Tech NA
+
+bluetooth:v07C5*
+ ID_VENDOR_FROM_DATABASE=June Life, Inc.
+
+bluetooth:v07C6*
+ ID_VENDOR_FROM_DATABASE=Bluenetics GmbH
+
+bluetooth:v07C7*
+ ID_VENDOR_FROM_DATABASE=iaconicDesign Inc.
+
+bluetooth:v07C8*
+ ID_VENDOR_FROM_DATABASE=WRLDS Creations AB
+
+bluetooth:v07C9*
+ ID_VENDOR_FROM_DATABASE=Skullcandy, Inc.
+
+bluetooth:v07CA*
+ ID_VENDOR_FROM_DATABASE=Modul-System HH AB
+
+bluetooth:v07CB*
+ ID_VENDOR_FROM_DATABASE=West Pharmaceutical Services, Inc.
+
+bluetooth:v07CC*
+ ID_VENDOR_FROM_DATABASE=Barnacle Systems Inc.
+
+bluetooth:v07CD*
+ ID_VENDOR_FROM_DATABASE=Smart Wave Technologies Canada Inc
+
+bluetooth:v07CE*
+ ID_VENDOR_FROM_DATABASE=Shanghai Top-Chip Microelectronics Tech. Co., LTD
+
+bluetooth:v07CF*
+ ID_VENDOR_FROM_DATABASE=NeoSensory, Inc.
+
+bluetooth:v07D0*
+ ID_VENDOR_FROM_DATABASE=Hangzhou Tuya Information Technology Co., Ltd
+
+bluetooth:v07D1*
+ ID_VENDOR_FROM_DATABASE=Shanghai Panchip Microelectronics Co., Ltd
+
+bluetooth:v07D2*
+ ID_VENDOR_FROM_DATABASE=React Accessibility Limited
+
+bluetooth:v07D3*
+ ID_VENDOR_FROM_DATABASE=LIVNEX Co.,Ltd.
+
+bluetooth:v07D4*
+ ID_VENDOR_FROM_DATABASE=Kano Computing Limited
+
+bluetooth:v07D5*
+ ID_VENDOR_FROM_DATABASE=hoots classic GmbH
+
+bluetooth:v07D6*
+ ID_VENDOR_FROM_DATABASE=ecobee Inc.
+
+bluetooth:v07D7*
+ ID_VENDOR_FROM_DATABASE=Nanjing Qinheng Microelectronics Co., Ltd
+
+bluetooth:v07D8*
+ ID_VENDOR_FROM_DATABASE=SOLUTIONS AMBRA INC.
+
+bluetooth:v07D9*
+ ID_VENDOR_FROM_DATABASE=Micro-Design, Inc.
+
+bluetooth:v07DA*
+ ID_VENDOR_FROM_DATABASE=STARLITE Co., Ltd.
+
+bluetooth:v07DB*
+ ID_VENDOR_FROM_DATABASE=Remedee Labs
+
+bluetooth:v07DC*
+ ID_VENDOR_FROM_DATABASE=ThingOS GmbH
+
+bluetooth:v07DD*
+ ID_VENDOR_FROM_DATABASE=Linear Circuits
+
+bluetooth:v07DE*
+ ID_VENDOR_FROM_DATABASE=Unlimited Engineering SL
+
+bluetooth:v07DF*
+ ID_VENDOR_FROM_DATABASE=Snap-on Incorporated
+
+bluetooth:v07E0*
+ ID_VENDOR_FROM_DATABASE=Edifier International Limited
+
+bluetooth:v07E1*
+ ID_VENDOR_FROM_DATABASE=Lucie Labs
+
+bluetooth:v07E2*
+ ID_VENDOR_FROM_DATABASE=Alfred Kaercher SE & Co. KG
+
+bluetooth:v07E3*
+ ID_VENDOR_FROM_DATABASE=Audiowise Technology Inc.
+
+bluetooth:v07E4*
+ ID_VENDOR_FROM_DATABASE=Geeksme S.L.
+
+bluetooth:v07E5*
+ ID_VENDOR_FROM_DATABASE=Minut, Inc.
+
+bluetooth:v07E6*
+ ID_VENDOR_FROM_DATABASE=Autogrow Systems Limited
+
+bluetooth:v07E7*
+ ID_VENDOR_FROM_DATABASE=Komfort IQ, Inc.
+
+bluetooth:v07E8*
+ ID_VENDOR_FROM_DATABASE=Packetcraft, Inc.
+
+bluetooth:v07E9*
+ ID_VENDOR_FROM_DATABASE=Häfele GmbH & Co KG
+
+bluetooth:v07EA*
+ ID_VENDOR_FROM_DATABASE=ShapeLog, Inc.
+
+bluetooth:v07EB*
+ ID_VENDOR_FROM_DATABASE=NOVABASE S.R.L.
+
+bluetooth:v07EC*
+ ID_VENDOR_FROM_DATABASE=Frecce LLC
+
+bluetooth:v07ED*
+ ID_VENDOR_FROM_DATABASE=Joule IQ, INC.
+
+bluetooth:v07EE*
+ ID_VENDOR_FROM_DATABASE=KidzTek LLC
+
+bluetooth:v07EF*
+ ID_VENDOR_FROM_DATABASE=Aktiebolaget Sandvik Coromant
+
+bluetooth:v07F0*
+ ID_VENDOR_FROM_DATABASE=e-moola.com Pty Ltd
+
+bluetooth:v07F1*
+ ID_VENDOR_FROM_DATABASE=GSM Innovations Pty Ltd
+
+bluetooth:v07F2*
+ ID_VENDOR_FROM_DATABASE=SERENE GROUP, INC
+
+bluetooth:v07F3*
+ ID_VENDOR_FROM_DATABASE=DIGISINE ENERGYTECH CO. LTD.
+
+bluetooth:v07F4*
+ ID_VENDOR_FROM_DATABASE=MEDIRLAB Orvosbiologiai Fejleszto Korlatolt Felelossegu Tarsasag
+
+bluetooth:v07F5*
+ ID_VENDOR_FROM_DATABASE=Byton North America Corporation
+
+bluetooth:v07F6*
+ ID_VENDOR_FROM_DATABASE=Shenzhen TonliScience and Technology Development Co.,Ltd
+
+bluetooth:v07F7*
+ ID_VENDOR_FROM_DATABASE=Cesar Systems Ltd.
+
+bluetooth:v07F8*
+ ID_VENDOR_FROM_DATABASE=quip NYC Inc.
+
+bluetooth:v07F9*
+ ID_VENDOR_FROM_DATABASE=Direct Communication Solutions, Inc.
+
+bluetooth:v07FA*
+ ID_VENDOR_FROM_DATABASE=Klipsch Group, Inc.
+
+bluetooth:v07FB*
+ ID_VENDOR_FROM_DATABASE=Access Co., Ltd
+
+bluetooth:v07FC*
+ ID_VENDOR_FROM_DATABASE=Renault SA
+
+bluetooth:v07FD*
+ ID_VENDOR_FROM_DATABASE=JSK CO., LTD.
+
+bluetooth:v07FE*
+ ID_VENDOR_FROM_DATABASE=BIROTA
+
+bluetooth:v07FF*
+ ID_VENDOR_FROM_DATABASE=maxon motor ltd.
+
+bluetooth:v0800*
+ ID_VENDOR_FROM_DATABASE=Optek
+
+bluetooth:v0801*
+ ID_VENDOR_FROM_DATABASE=CRONUS ELECTRONICS LTD
+
+bluetooth:v0802*
+ ID_VENDOR_FROM_DATABASE=NantSound, Inc.
+
+bluetooth:v0803*
+ ID_VENDOR_FROM_DATABASE=Domintell s.a.
+
+bluetooth:v0804*
+ ID_VENDOR_FROM_DATABASE=Andon Health Co.,Ltd
+
+bluetooth:v0805*
+ ID_VENDOR_FROM_DATABASE=Urbanminded Ltd
+
+bluetooth:v0806*
+ ID_VENDOR_FROM_DATABASE=TYRI Sweden AB
+
+bluetooth:v0807*
+ ID_VENDOR_FROM_DATABASE=ECD Electronic Components GmbH Dresden
+
+bluetooth:v0808*
+ ID_VENDOR_FROM_DATABASE=SISTEMAS KERN, SOCIEDAD ANÓMINA
+
+bluetooth:v0809*
+ ID_VENDOR_FROM_DATABASE=Trulli Audio
+
+bluetooth:v080A*
+ ID_VENDOR_FROM_DATABASE=Altaneos
+
+bluetooth:v080B*
+ ID_VENDOR_FROM_DATABASE=Nanoleaf Canada Limited
+
+bluetooth:v080C*
+ ID_VENDOR_FROM_DATABASE=Ingy B.V.
+
+bluetooth:v080D*
+ ID_VENDOR_FROM_DATABASE=Azbil Co.
+
+bluetooth:v080E*
+ ID_VENDOR_FROM_DATABASE=TATTCOM LLC
+
+bluetooth:v080F*
+ ID_VENDOR_FROM_DATABASE=Paradox Engineering SA
+
+bluetooth:v0810*
+ ID_VENDOR_FROM_DATABASE=LECO Corporation
+
+bluetooth:v0811*
+ ID_VENDOR_FROM_DATABASE=Becker Antriebe GmbH
+
+bluetooth:v0812*
+ ID_VENDOR_FROM_DATABASE=Mstream Technologies., Inc.
+
+bluetooth:v0813*
+ ID_VENDOR_FROM_DATABASE=Flextronics International USA Inc.
+
+bluetooth:v0814*
+ ID_VENDOR_FROM_DATABASE=Ossur hf.
+
+bluetooth:v0815*
+ ID_VENDOR_FROM_DATABASE=SKC Inc
+
+bluetooth:v0816*
+ ID_VENDOR_FROM_DATABASE=SPICA SYSTEMS LLC
+
+bluetooth:v0817*
+ ID_VENDOR_FROM_DATABASE=Wangs Alliance Corporation
+
+bluetooth:v0818*
+ ID_VENDOR_FROM_DATABASE=tatwah SA
+
+bluetooth:v0819*
+ ID_VENDOR_FROM_DATABASE=Hunter Douglas Inc
+
+bluetooth:v081A*
+ ID_VENDOR_FROM_DATABASE=Shenzhen Conex
+
+bluetooth:v081B*
+ ID_VENDOR_FROM_DATABASE=DIM3
+
+bluetooth:v081C*
+ ID_VENDOR_FROM_DATABASE=Bobrick Washroom Equipment, Inc.
+
+bluetooth:v081D*
+ ID_VENDOR_FROM_DATABASE=Potrykus Holdings and Development LLC
+
+bluetooth:v081E*
+ ID_VENDOR_FROM_DATABASE=iNFORM Technology GmbH
+
+bluetooth:v081F*
+ ID_VENDOR_FROM_DATABASE=eSenseLab LTD
+
+bluetooth:v0820*
+ ID_VENDOR_FROM_DATABASE=Brilliant Home Technology, Inc.
+
+bluetooth:v0821*
+ ID_VENDOR_FROM_DATABASE=INOVA Geophysical, Inc.
+
+bluetooth:v0822*
+ ID_VENDOR_FROM_DATABASE=adafruit industries
+
+bluetooth:v0823*
+ ID_VENDOR_FROM_DATABASE=Nexite Ltd
+
+bluetooth:v0824*
+ ID_VENDOR_FROM_DATABASE=8Power Limited
+
+bluetooth:v0825*
+ ID_VENDOR_FROM_DATABASE=CME PTE. LTD.
+
+bluetooth:v0826*
+ ID_VENDOR_FROM_DATABASE=Hyundai Motor Company
+
+bluetooth:v0827*
+ ID_VENDOR_FROM_DATABASE=Kickmaker
+
+bluetooth:v0828*
+ ID_VENDOR_FROM_DATABASE=Shanghai Suisheng Information Technology Co., Ltd.
+
+bluetooth:v0829*
+ ID_VENDOR_FROM_DATABASE=HEXAGON
+
+bluetooth:v082A*
+ ID_VENDOR_FROM_DATABASE=Mitutoyo Corporation
+
+bluetooth:v082B*
+ ID_VENDOR_FROM_DATABASE=shenzhen fitcare electronics Co.,Ltd
+
+bluetooth:v082C*
+ ID_VENDOR_FROM_DATABASE=INGICS TECHNOLOGY CO., LTD.
+
+bluetooth:v082D*
+ ID_VENDOR_FROM_DATABASE=INCUS PERFORMANCE LTD.
+
+bluetooth:v082E*
+ ID_VENDOR_FROM_DATABASE=ABB S.p.A.
+
+bluetooth:v082F*
+ ID_VENDOR_FROM_DATABASE=Blippit AB
+
+bluetooth:v0830*
+ ID_VENDOR_FROM_DATABASE=Core Health and Fitness LLC
+
+bluetooth:v0831*
+ ID_VENDOR_FROM_DATABASE=Foxble, LLC
+
+bluetooth:v0832*
+ ID_VENDOR_FROM_DATABASE=Intermotive,Inc.
+
+bluetooth:v0833*
+ ID_VENDOR_FROM_DATABASE=Conneqtech B.V.
+
+bluetooth:v0834*
+ ID_VENDOR_FROM_DATABASE=RIKEN KEIKI CO., LTD.,
+
+bluetooth:v0835*
+ ID_VENDOR_FROM_DATABASE=Canopy Growth Corporation
+
+bluetooth:v0836*
+ ID_VENDOR_FROM_DATABASE=Bitwards Oy
+
+bluetooth:v0837*
+ ID_VENDOR_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
+
+bluetooth:v0838*
+ ID_VENDOR_FROM_DATABASE=Etymotic Research, Inc.
+
+bluetooth:v0839*
+ ID_VENDOR_FROM_DATABASE=A puissance 3
+
+bluetooth:v083A*
+ ID_VENDOR_FROM_DATABASE=BPW Bergische Achsen Kommanditgesellschaft
+
+bluetooth:v083B*
+ ID_VENDOR_FROM_DATABASE=Piaggio Fast Forward
+
+bluetooth:v083C*
+ ID_VENDOR_FROM_DATABASE=BeerTech LTD
+
+bluetooth:v083D*
+ ID_VENDOR_FROM_DATABASE=Tokenize, Inc.
+
+bluetooth:v083E*
+ ID_VENDOR_FROM_DATABASE=Zorachka LTD
+
+bluetooth:v083F*
+ ID_VENDOR_FROM_DATABASE=D-Link Corp.
+
+bluetooth:v0840*
+ ID_VENDOR_FROM_DATABASE=Down Range Systems LLC
+
+bluetooth:v0841*
+ ID_VENDOR_FROM_DATABASE=General Luminaire (Shanghai) Co., Ltd.
+
+bluetooth:v0842*
+ ID_VENDOR_FROM_DATABASE=Tangshan HongJia electronic technology co., LTD.
+
+bluetooth:v0843*
+ ID_VENDOR_FROM_DATABASE=FRAGRANCE DELIVERY TECHNOLOGIES LTD
+
+bluetooth:v0844*
+ ID_VENDOR_FROM_DATABASE=Pepperl + Fuchs GmbH
+
+bluetooth:v0845*
+ ID_VENDOR_FROM_DATABASE=Dometic Corporation
+
+bluetooth:v0846*
+ ID_VENDOR_FROM_DATABASE=USound GmbH
+
+bluetooth:v0847*
+ ID_VENDOR_FROM_DATABASE=DNANUDGE LIMITED
+
+bluetooth:v0848*
+ ID_VENDOR_FROM_DATABASE=JUJU JOINTS CANADA CORP.
+
+bluetooth:v0849*
+ ID_VENDOR_FROM_DATABASE=Dopple Technologies B.V.
+
+bluetooth:v084A*
+ ID_VENDOR_FROM_DATABASE=ARCOM
+
+bluetooth:v084B*
+ ID_VENDOR_FROM_DATABASE=Biotechware SRL
+
+bluetooth:v084C*
+ ID_VENDOR_FROM_DATABASE=ORSO Inc.
+
+bluetooth:v084D*
+ ID_VENDOR_FROM_DATABASE=SafePort
+
+bluetooth:v084E*
+ ID_VENDOR_FROM_DATABASE=Carol Cole Company
+
+bluetooth:v084F*
+ ID_VENDOR_FROM_DATABASE=Embedded Fitness B.V.
+
+bluetooth:v0850*
+ ID_VENDOR_FROM_DATABASE=Yealink (Xiamen) Network Technology Co.,LTD
+
+bluetooth:v0851*
+ ID_VENDOR_FROM_DATABASE=Subeca, Inc.
+
+bluetooth:v0852*
+ ID_VENDOR_FROM_DATABASE=Cognosos, Inc.
+
+bluetooth:v0853*
+ ID_VENDOR_FROM_DATABASE=Pektron Group Limited
+
+bluetooth:v0854*
+ ID_VENDOR_FROM_DATABASE=Tap Sound System
+
+bluetooth:v0855*
+ ID_VENDOR_FROM_DATABASE=Helios Hockey, Inc.
+
+bluetooth:v0856*
+ ID_VENDOR_FROM_DATABASE=Canopy Growth Corporation
+
+bluetooth:v0857*
+ ID_VENDOR_FROM_DATABASE=Parsyl Inc
+
+bluetooth:v0858*
+ ID_VENDOR_FROM_DATABASE=SOUNDBOKS
+
+bluetooth:v0859*
+ ID_VENDOR_FROM_DATABASE=BlueUp
+
+bluetooth:v085A*
+ ID_VENDOR_FROM_DATABASE=DAKATECH
+
+bluetooth:v085B*
+ ID_VENDOR_FROM_DATABASE=RICOH ELECTRONIC DEVICES CO., LTD.
+
+bluetooth:v085C*
+ ID_VENDOR_FROM_DATABASE=ACOS CO.,LTD.
+
+bluetooth:v085D*
+ ID_VENDOR_FROM_DATABASE=Guilin Zhishen Information Technology Co.,Ltd.
+
+bluetooth:v085E*
+ ID_VENDOR_FROM_DATABASE=Krog Systems LLC
+
+bluetooth:v085F*
+ ID_VENDOR_FROM_DATABASE=COMPEGPS TEAM,SOCIEDAD LIMITADA
+
+bluetooth:v0860*
+ ID_VENDOR_FROM_DATABASE=Alflex Products B.V.
+
+bluetooth:v0861*
+ ID_VENDOR_FROM_DATABASE=SmartSensor Labs Ltd
+
+bluetooth:v0862*
+ ID_VENDOR_FROM_DATABASE=SmartDrive Inc.
+
+bluetooth:v0863*
+ ID_VENDOR_FROM_DATABASE=Yo-tronics Technology Co., Ltd.
+
+bluetooth:v0864*
+ ID_VENDOR_FROM_DATABASE=Rafaelmicro
+
+bluetooth:v0865*
+ ID_VENDOR_FROM_DATABASE=Emergency Lighting Products Limited
+
+bluetooth:v0866*
+ ID_VENDOR_FROM_DATABASE=LAONZ Co.,Ltd
+
+bluetooth:v0867*
+ ID_VENDOR_FROM_DATABASE=Western Digital Techologies, Inc.
+
+bluetooth:v0868*
+ ID_VENDOR_FROM_DATABASE=WIOsense GmbH & Co. KG
+
+bluetooth:v0869*
+ ID_VENDOR_FROM_DATABASE=EVVA Sicherheitstechnologie GmbH
+
+bluetooth:v086A*
+ ID_VENDOR_FROM_DATABASE=Odic Incorporated
+
+bluetooth:v086B*
+ ID_VENDOR_FROM_DATABASE=Pacific Track, LLC
+
+bluetooth:v086C*
+ ID_VENDOR_FROM_DATABASE=Revvo Technologies, Inc.
+
+bluetooth:v086D*
+ ID_VENDOR_FROM_DATABASE=Biometrika d.o.o.
+
+bluetooth:v086E*
+ ID_VENDOR_FROM_DATABASE=Vorwerk Elektrowerke GmbH & Co. KG
+
+bluetooth:v086F*
+ ID_VENDOR_FROM_DATABASE=Trackunit A/S
+
+bluetooth:v0870*
+ ID_VENDOR_FROM_DATABASE=Wyze Labs, Inc
+
+bluetooth:v0871*
+ ID_VENDOR_FROM_DATABASE=Dension Elektronikai Kft. (formerly: Dension Audio Systems Ltd.)
+
+bluetooth:v0872*
+ ID_VENDOR_FROM_DATABASE=11 Health & Technologies Limited
+
+bluetooth:v0873*
+ ID_VENDOR_FROM_DATABASE=Innophase Incorporated
+
+bluetooth:v0874*
+ ID_VENDOR_FROM_DATABASE=Treegreen Limited
+
+bluetooth:v0875*
+ ID_VENDOR_FROM_DATABASE=Berner International LLC
+
+bluetooth:v0876*
+ ID_VENDOR_FROM_DATABASE=SmartResQ ApS
+
+bluetooth:v0877*
+ ID_VENDOR_FROM_DATABASE=Tome, Inc.
+
+bluetooth:v0878*
+ ID_VENDOR_FROM_DATABASE=The Chamberlain Group, Inc.
+
+bluetooth:v0879*
+ ID_VENDOR_FROM_DATABASE=MIZUNO Corporation
+
+bluetooth:v087A*
+ ID_VENDOR_FROM_DATABASE=ZRF, LLC
+
+bluetooth:v087B*
+ ID_VENDOR_FROM_DATABASE=BYSTAMP
+
+bluetooth:v087C*
+ ID_VENDOR_FROM_DATABASE=Crosscan GmbH
+
+bluetooth:v087D*
+ ID_VENDOR_FROM_DATABASE=Konftel AB
+
+bluetooth:v087E*
+ ID_VENDOR_FROM_DATABASE=1bar.net Limited
+
+bluetooth:v087F*
+ ID_VENDOR_FROM_DATABASE=Phillips Connect Technologies LLC
+
+bluetooth:v0880*
+ ID_VENDOR_FROM_DATABASE=imagiLabs AB
+
+bluetooth:v0881*
+ ID_VENDOR_FROM_DATABASE=Optalert
+
+bluetooth:v0882*
+ ID_VENDOR_FROM_DATABASE=PSYONIC, Inc.
+
+bluetooth:v0883*
+ ID_VENDOR_FROM_DATABASE=Wintersteiger AG
+
+bluetooth:v0884*
+ ID_VENDOR_FROM_DATABASE=Controlid Industria, Comercio de Hardware e Servicos de Tecnologia Ltda
+
+bluetooth:v0885*
+ ID_VENDOR_FROM_DATABASE=LEVOLOR, INC.
+
+bluetooth:v0886*
+ ID_VENDOR_FROM_DATABASE=Xsens Technologies B.V.
+
+bluetooth:v0887*
+ ID_VENDOR_FROM_DATABASE=Hydro-Gear Limited Partnership
+
+bluetooth:v0888*
+ ID_VENDOR_FROM_DATABASE=EnPointe Fencing Pty Ltd
+
+bluetooth:v0889*
+ ID_VENDOR_FROM_DATABASE=XANTHIO
+
+bluetooth:v088A*
+ ID_VENDOR_FROM_DATABASE=sclak s.r.l.
+
+bluetooth:v088B*
+ ID_VENDOR_FROM_DATABASE=Tricorder Arraay Technologies LLC
+
+bluetooth:v088C*
+ ID_VENDOR_FROM_DATABASE=GB Solution co.,Ltd
+
+bluetooth:v088D*
+ ID_VENDOR_FROM_DATABASE=Soliton Systems K.K.
+
+bluetooth:v088E*
+ ID_VENDOR_FROM_DATABASE=GIGA-TMS INC
+
+bluetooth:v088F*
+ ID_VENDOR_FROM_DATABASE=Tait International Limited
+
+bluetooth:v0890*
+ ID_VENDOR_FROM_DATABASE=NICHIEI INTEC CO., LTD.
+
+bluetooth:v0891*
+ ID_VENDOR_FROM_DATABASE=SmartWireless GmbH & Co. KG
+
+bluetooth:v0892*
+ ID_VENDOR_FROM_DATABASE=Ingenieurbuero Birnfeld UG (haftungsbeschraenkt)
+
+bluetooth:v0893*
+ ID_VENDOR_FROM_DATABASE=Maytronics Ltd
+
+bluetooth:v0894*
+ ID_VENDOR_FROM_DATABASE=EPIFIT
+
+bluetooth:v0895*
+ ID_VENDOR_FROM_DATABASE=Gimer medical
+
+bluetooth:v0896*
+ ID_VENDOR_FROM_DATABASE=Nokian Renkaat Oyj
+
+bluetooth:v0897*
+ ID_VENDOR_FROM_DATABASE=Current Lighting Solutions LLC
+
+bluetooth:v0898*
+ ID_VENDOR_FROM_DATABASE=Sensibo, Inc.
+
+bluetooth:v0899*
+ ID_VENDOR_FROM_DATABASE=SFS unimarket AG
+
+bluetooth:v089A*
+ ID_VENDOR_FROM_DATABASE=Private limited company "Teltonika"
+
+bluetooth:v089B*
+ ID_VENDOR_FROM_DATABASE=Saucon Technologies
+
+bluetooth:v089C*
+ ID_VENDOR_FROM_DATABASE=Embedded Devices Co. Company
+
+bluetooth:v089D*
+ ID_VENDOR_FROM_DATABASE=J-J.A.D.E. Enterprise LLC
+
+bluetooth:v089E*
+ ID_VENDOR_FROM_DATABASE=i-SENS, inc.
+
+bluetooth:v089F*
+ ID_VENDOR_FROM_DATABASE=Witschi Electronic Ltd
+
+bluetooth:v08A0*
+ ID_VENDOR_FROM_DATABASE=Aclara Technologies LLC
+
+bluetooth:v08A1*
+ ID_VENDOR_FROM_DATABASE=EXEO TECH CORPORATION
+
+bluetooth:v08A2*
+ ID_VENDOR_FROM_DATABASE=Epic Systems Co., Ltd.
+
+bluetooth:v08A3*
+ ID_VENDOR_FROM_DATABASE=Hoffmann SE
+
+bluetooth:v08A4*
+ ID_VENDOR_FROM_DATABASE=Realme Chongqing Mobile Telecommunications Corp., Ltd.
+
+bluetooth:v08A5*
+ ID_VENDOR_FROM_DATABASE=UMEHEAL Ltd
+
+bluetooth:v08A6*
+ ID_VENDOR_FROM_DATABASE=Intelligenceworks Inc.
+
+bluetooth:v08A7*
+ ID_VENDOR_FROM_DATABASE=TGR 1.618 Limited
+
+bluetooth:v08A8*
+ ID_VENDOR_FROM_DATABASE=Shanghai Kfcube Inc
+
+bluetooth:v08A9*
+ ID_VENDOR_FROM_DATABASE=Fraunhofer IIS
+
+bluetooth:v08AA*
+ ID_VENDOR_FROM_DATABASE=SZ DJI TECHNOLOGY CO.,LTD
+
+bluetooth:v08AB*
+ ID_VENDOR_FROM_DATABASE=Coburn Technology, LLC
+
+bluetooth:v08AC*
+ ID_VENDOR_FROM_DATABASE=Topre Corporation
+
+bluetooth:v08AD*
+ ID_VENDOR_FROM_DATABASE=Kayamatics Limited
+
+bluetooth:v08AE*
+ ID_VENDOR_FROM_DATABASE=Moticon ReGo AG
diff --git a/man/coredumpctl.xml b/man/coredumpctl.xml
index 4e99bc0d6..ab5dffdfb 100644
--- a/man/coredumpctl.xml
+++ b/man/coredumpctl.xml
@@ -217,6 +217,17 @@
will be used.
+
+
+
+ Takes a file glob as an argument. If
+ specified, coredumpctl will operate on the specified journal
+ files matching GLOB instead of the
+ default runtime and system journal paths. May be specified
+ multiple times, in which case files will be suitably
+ interleaved.
+
+
DIR
DIR
diff --git a/man/homectl.xml b/man/homectl.xml
index ae502c8eb..2d99af93b 100644
--- a/man/homectl.xml
+++ b/man/homectl.xml
@@ -677,7 +677,10 @@
Create a new home directory/user account of the specified name. Use the various
user record property options (as documented above) to control various aspects of the home directory
- and its user accounts.
+ and its user accounts.
+
+ The specified user name should follow the strict syntax described on User/Group Name Syntax.
diff --git a/man/journalctl.xml b/man/journalctl.xml
index 2a685d1ee..1e5f95e19 100644
--- a/man/journalctl.xml
+++ b/man/journalctl.xml
@@ -398,8 +398,8 @@
- A comma separated list of the fields which should be included in the output. This only has an
- effect for the output modes which would normally show all fields (,
+ A comma separated list of the fields which should be included in the output. This has an
+ effect only for the output modes which would normally show all fields (,
, , , and
). The __CURSOR, __REALTIME_TIMESTAMP,
__MONOTONIC_TIMESTAMP, and _BOOT_ID fields are always
@@ -416,8 +416,13 @@
- Don't show the hostname field of log messages originating from the local host. This switch only
- has an effect on the family of output modes (see above).
+ Don't show the hostname field of log messages originating from the local host. This
+ switch has an effect only on the family of output modes (see above).
+
+
+ Note: this option does not remove occurrences of the hostname from log entries themselves, so
+ it does not prevent the hostname from being visible in the logs.
+
diff --git a/man/systemd-run.xml b/man/systemd-run.xml
index 3a1d18dae..6fc2c8d0e 100644
--- a/man/systemd-run.xml
+++ b/man/systemd-run.xml
@@ -146,8 +146,10 @@
- Make the new .service or .scope unit part of the
- specified slice, instead of system.slice.
+ Make the new .service or .scope unit part
+ of the specified slice, instead of system.slice (when running in
+ mode) or the root slice (when running in
+ mode).
diff --git a/man/systemd.exec.xml b/man/systemd.exec.xml
index 79a2c744c..fd1755e42 100644
--- a/man/systemd.exec.xml
+++ b/man/systemd.exec.xml
@@ -217,12 +217,15 @@
is set, the default group of the user is used. This setting does not affect commands whose command line is
prefixed with +.
- Note that restrictions on the user/group name syntax are enforced: the specified name must consist only
- of the characters a-z, A-Z, 0-9, _ and -, except for the first character
- which must be one of a-z, A-Z or _ (i.e. numbers and - are not permitted
- as first character). The user/group name must have at least one character, and at most 31. These restrictions
- are enforced in order to avoid ambiguities and to ensure user/group names and unit files remain portable among
- Linux systems.
+ Note that this enforces only weak restrictions on the user/group name syntax, but will generate
+ warnings in many cases where user/group names do not adhere to the following rules: the specified
+ name should consist only of the characters a-z, A-Z, 0-9, _ and
+ -, except for the first character which must be one of a-z, A-Z and
+ _ (i.e. digits and - are not permitted as first character). The
+ user/group name must have at least one character, and at most 31. These restrictions are made in
+ order to avoid ambiguities and to ensure user/group names and unit files remain portable among Linux
+ systems. For further details on the names accepted and the names warned about see User/Group Name Syntax.
When used in conjunction with DynamicUser= the user/group name specified is
dynamically allocated at the time the service is started, and released at the time the service is
diff --git a/man/systemd.service.xml b/man/systemd.service.xml
index 17e446e20..02eb70678 100644
--- a/man/systemd.service.xml
+++ b/man/systemd.service.xml
@@ -423,6 +423,9 @@
ExecStart=, or ExecStartPost= fail (and are not prefixed with
-, see above) or time out before the service is fully up, execution continues with commands
specified in ExecStopPost=, the commands in ExecStop= are skipped.
+
+ Note that the execution of ExecStartPost= is taken into account for the purpose of
+ Before=/After= ordering constraints.
@@ -534,7 +537,10 @@
service, as well as the main process' exit code and status, set in the $SERVICE_RESULT,
$EXIT_CODE and $EXIT_STATUS environment variables, see
systemd.exec5 for
- details.
+ details.
+
+ Note that the execution of ExecStopPost= is taken into account for the purpose of
+ Before=/After= ordering constraints.
diff --git a/man/systemd.unit.xml b/man/systemd.unit.xml
index 64240208c..0d223d74d 100644
--- a/man/systemd.unit.xml
+++ b/man/systemd.unit.xml
@@ -750,7 +750,7 @@
type when precisely a unit has finished starting up. Most importantly, for service units start-up is
considered completed for the purpose of Before=/After= when all
its configured start-up commands have been invoked and they either failed or reported start-up
- success.
+ success. Note that this does includes ExecStartPost (or ExecStopPost for the shutdown case).
Note that those settings are independent of and orthogonal to the requirement dependencies as
configured by Requires=, Wants=, Requisite=,
diff --git a/man/sysusers.d.xml b/man/sysusers.d.xml
index c632e8713..f0e0f2bed 100644
--- a/man/sysusers.d.xml
+++ b/man/sysusers.d.xml
@@ -154,6 +154,9 @@ r - 500-900
A-Z or _ (i.e. numbers and - are not permitted as first character). The
user/group name must have at least one character, and at most 31.
+ For further details about the syntax of user/group names, see User/Group Name Syntax.
+
It is strongly recommended to pick user and group names that are unlikely to clash with normal users
created by the administrator. A good scheme to guarantee this is by prefixing all system and group names with the
underscore, and avoiding too generic names.
diff --git a/src/analyze/analyze-verify.c b/src/analyze/analyze-verify.c
index 4cfbdfa5a..8275360ad 100644
--- a/src/analyze/analyze-verify.c
+++ b/src/analyze/analyze-verify.c
@@ -124,10 +124,13 @@ static int verify_socket(Unit *u) {
return 0;
}
-static int verify_executable(Unit *u, ExecCommand *exec) {
+int verify_executable(Unit *u, const ExecCommand *exec) {
if (!exec)
return 0;
+ if (exec->flags & EXEC_COMMAND_IGNORE_FAILURE)
+ return 0;
+
if (access(exec->path, X_OK) < 0)
return log_unit_error_errno(u, errno, "Command %s is not executable: %m", exec->path);
diff --git a/src/analyze/analyze-verify.h b/src/analyze/analyze-verify.h
index 3561d4302..3da2cf709 100644
--- a/src/analyze/analyze-verify.h
+++ b/src/analyze/analyze-verify.h
@@ -3,6 +3,8 @@
#include
+#include "execute.h"
#include "path-lookup.h"
+int verify_executable(Unit *u, const ExecCommand *exec);
int verify_units(char **filenames, UnitFileScope scope, bool check_man, bool run_generators);
diff --git a/src/analyze/test-verify.c b/src/analyze/test-verify.c
new file mode 100644
index 000000000..dcbb6394c
--- /dev/null
+++ b/src/analyze/test-verify.c
@@ -0,0 +1,19 @@
+/* SPDX-License-Identifier: LGPL-2.1+ */
+#include "analyze-verify.h"
+#include "tests.h"
+
+static void test_verify_nonexistent(void) {
+ /* Negative cases */
+ assert_se(verify_executable(NULL, &(ExecCommand) {.flags = EXEC_COMMAND_IGNORE_FAILURE, .path = (char*) "/non/existent"}) == 0);
+ assert_se(verify_executable(NULL, &(ExecCommand) {.path = (char*) "/non/existent"}) < 0);
+
+ /* Ordinary cases */
+ assert_se(verify_executable(NULL, &(ExecCommand) {.path = (char*) "/bin/echo"}) == 0);
+ assert_se(verify_executable(NULL, &(ExecCommand) {.flags = EXEC_COMMAND_IGNORE_FAILURE, .path = (char*) "/bin/echo"}) == 0);
+}
+
+int main(int argc, char *argv[]) {
+ test_setup_logging(LOG_DEBUG);
+
+ test_verify_nonexistent();
+}
diff --git a/src/basic/capability-util.c b/src/basic/capability-util.c
index caffda62a..9dbebfa16 100644
--- a/src/basic/capability-util.c
+++ b/src/basic/capability-util.c
@@ -107,11 +107,13 @@ int capability_ambient_set_apply(uint64_t set, bool also_inherit) {
unsigned long i;
int r;
+ /* Add the capabilities to the ambient set (an possibly also the inheritable set) */
+
/* Check that we can use PR_CAP_AMBIENT or quit early. */
if (!ambient_capabilities_supported())
- return 0;
-
- /* Add the capabilities to the ambient set. */
+ return (set & all_capabilities()) == 0 ?
+ 0 : -EOPNOTSUPP; /* if actually no ambient caps are to be set, be silent,
+ * otherwise fail recognizably */
if (also_inherit) {
caps = cap_get_proc();
diff --git a/src/basic/fileio.c b/src/basic/fileio.c
index fe0c4f470..ec9d76688 100644
--- a/src/basic/fileio.c
+++ b/src/basic/fileio.c
@@ -81,7 +81,7 @@ int write_string_stream_ts(
struct timespec *ts) {
bool needs_nl;
- int r;
+ int r, fd;
assert(f);
assert(line);
@@ -89,6 +89,14 @@ int write_string_stream_ts(
if (ferror(f))
return -EIO;
+ if (ts) {
+ /* If we shall set the timestamp we need the fd. But fmemopen() streams generally don't have
+ * an fd. Let's fail early in that case. */
+ fd = fileno(f);
+ if (fd < 0)
+ return -EBADF;
+ }
+
needs_nl = !(flags & WRITE_STRING_FILE_AVOID_NEWLINE) && !endswith(line, "\n");
if (needs_nl && (flags & WRITE_STRING_FILE_DISABLE_BUFFER)) {
@@ -116,7 +124,7 @@ int write_string_stream_ts(
if (ts) {
struct timespec twice[2] = {*ts, *ts};
- if (futimens(fileno(f), twice) < 0)
+ if (futimens(fd, twice) < 0)
return -errno;
}
@@ -848,7 +856,7 @@ int fflush_and_check(FILE *f) {
}
int fflush_sync_and_check(FILE *f) {
- int r;
+ int r, fd;
assert(f);
@@ -856,10 +864,16 @@ int fflush_sync_and_check(FILE *f) {
if (r < 0)
return r;
- if (fsync(fileno(f)) < 0)
+ /* Not all file streams have an fd associated (think: fmemopen()), let's handle this gracefully and
+ * assume that in that case we need no explicit syncing */
+ fd = fileno(f);
+ if (fd < 0)
+ return 0;
+
+ if (fsync(fd) < 0)
return -errno;
- r = fsync_directory_of_file(fileno(f));
+ r = fsync_directory_of_file(fd);
if (r < 0)
return r;
@@ -957,7 +971,7 @@ DEFINE_TRIVIAL_CLEANUP_FUNC(FILE*, funlockfile);
int read_line_full(FILE *f, size_t limit, ReadLineFlags flags, char **ret) {
size_t n = 0, allocated = 0, count = 0;
_cleanup_free_ char *buffer = NULL;
- int r, tty = -1;
+ int r;
assert(f);
@@ -1032,13 +1046,23 @@ int read_line_full(FILE *f, size_t limit, ReadLineFlags flags, char **ret) {
count++;
if (eol != EOL_NONE) {
- /* If we are on a tty, we can't wait for more input. But we expect only
- * \n as the single EOL marker, so there is no need to wait. We check
- * this condition last to avoid isatty() check if not necessary. */
+ /* If we are on a tty, we can't shouldn't wait for more input, because that
+ * generally means waiting for the user, interactively. In the case of a TTY
+ * we expect only \n as the single EOL marker, so we are in the lucky
+ * position that there is no need to wait. We check this condition last, to
+ * avoid isatty() check if not necessary. */
- if (tty < 0)
- tty = isatty(fileno(f));
- if (tty > 0)
+ if ((flags & (READ_LINE_IS_A_TTY|READ_LINE_NOT_A_TTY)) == 0) {
+ int fd;
+
+ fd = fileno(f);
+ if (fd < 0) /* Maybe an fmemopen() stream? Handle this gracefully,
+ * and don't call isatty() on an invalid fd */
+ flags |= READ_LINE_NOT_A_TTY;
+ else
+ flags |= isatty(fd) ? READ_LINE_IS_A_TTY : READ_LINE_NOT_A_TTY;
+ }
+ if (FLAGS_SET(flags, READ_LINE_IS_A_TTY))
break;
}
diff --git a/src/basic/fileio.h b/src/basic/fileio.h
index e6fea2afd..d140bfd99 100644
--- a/src/basic/fileio.h
+++ b/src/basic/fileio.h
@@ -85,7 +85,9 @@ int read_timestamp_file(const char *fn, usec_t *ret);
int fputs_with_space(FILE *f, const char *s, const char *separator, bool *space);
typedef enum ReadLineFlags {
- READ_LINE_ONLY_NUL = 1 << 0,
+ READ_LINE_ONLY_NUL = 1 << 0,
+ READ_LINE_IS_A_TTY = 1 << 1,
+ READ_LINE_NOT_A_TTY = 1 << 2,
} ReadLineFlags;
int read_line_full(FILE *f, size_t limit, ReadLineFlags flags, char **ret);
diff --git a/src/basic/string-util.c b/src/basic/string-util.c
index 8f812d7cb..93b7a2203 100644
--- a/src/basic/string-util.c
+++ b/src/basic/string-util.c
@@ -113,7 +113,7 @@ static size_t strcspn_escaped(const char *s, const char *reject) {
bool escaped = false;
int n;
- for (n=0; s[n]; n++) {
+ for (n = 0; s[n] != '\0'; n++) {
if (escaped)
escaped = false;
else if (s[n] == '\\')
@@ -122,8 +122,7 @@ static size_t strcspn_escaped(const char *s, const char *reject) {
break;
}
- /* if s ends in \, return index of previous char */
- return n - escaped;
+ return n;
}
/* Split a string into words. */
diff --git a/src/basic/terminal-util.c b/src/basic/terminal-util.c
index 511734cbb..6cacde90b 100644
--- a/src/basic/terminal-util.c
+++ b/src/basic/terminal-util.c
@@ -81,31 +81,34 @@ int chvt(int vt) {
int read_one_char(FILE *f, char *ret, usec_t t, bool *need_nl) {
_cleanup_free_ char *line = NULL;
struct termios old_termios;
- int r;
+ int r, fd;
assert(f);
assert(ret);
- /* If this is a terminal, then switch canonical mode off, so that we can read a single character */
- if (tcgetattr(fileno(f), &old_termios) >= 0) {
+ /* If this is a terminal, then switch canonical mode off, so that we can read a single
+ * character. (Note that fmemopen() streams do not have an fd associated with them, let's handle that
+ * nicely.) */
+ fd = fileno(f);
+ if (fd >= 0 && tcgetattr(fd, &old_termios) >= 0) {
struct termios new_termios = old_termios;
new_termios.c_lflag &= ~ICANON;
new_termios.c_cc[VMIN] = 1;
new_termios.c_cc[VTIME] = 0;
- if (tcsetattr(fileno(f), TCSADRAIN, &new_termios) >= 0) {
+ if (tcsetattr(fd, TCSADRAIN, &new_termios) >= 0) {
char c;
if (t != USEC_INFINITY) {
- if (fd_wait_for_event(fileno(f), POLLIN, t) <= 0) {
- (void) tcsetattr(fileno(f), TCSADRAIN, &old_termios);
+ if (fd_wait_for_event(fd, POLLIN, t) <= 0) {
+ (void) tcsetattr(fd, TCSADRAIN, &old_termios);
return -ETIMEDOUT;
}
}
r = safe_fgetc(f, &c);
- (void) tcsetattr(fileno(f), TCSADRAIN, &old_termios);
+ (void) tcsetattr(fd, TCSADRAIN, &old_termios);
if (r < 0)
return r;
if (r == 0)
@@ -119,8 +122,13 @@ int read_one_char(FILE *f, char *ret, usec_t t, bool *need_nl) {
}
}
- if (t != USEC_INFINITY) {
- if (fd_wait_for_event(fileno(f), POLLIN, t) <= 0)
+ if (t != USEC_INFINITY && fd > 0) {
+ /* Let's wait the specified amount of time for input. When we have no fd we skip this, under
+ * the assumption that this is an fmemopen() stream or so where waiting doesn't make sense
+ * anyway, as the data is either already in the stream or cannot possible be placed there
+ * while we access the stream */
+
+ if (fd_wait_for_event(fd, POLLIN, t) <= 0)
return -ETIMEDOUT;
}
@@ -778,6 +786,9 @@ const char *default_term_for_tty(const char *tty) {
int fd_columns(int fd) {
struct winsize ws = {};
+ if (fd < 0)
+ return -EBADF;
+
if (ioctl(fd, TIOCGWINSZ, &ws) < 0)
return -errno;
@@ -812,6 +823,9 @@ unsigned columns(void) {
int fd_lines(int fd) {
struct winsize ws = {};
+ if (fd < 0)
+ return -EBADF;
+
if (ioctl(fd, TIOCGWINSZ, &ws) < 0)
return -errno;
diff --git a/src/basic/user-util.c b/src/basic/user-util.c
index 1510fc96e..2e3580017 100644
--- a/src/basic/user-util.c
+++ b/src/basic/user-util.c
@@ -10,6 +10,8 @@
#include
#include
+#include "sd-messages.h"
+
#include "alloc-util.h"
#include "errno-util.h"
#include "fd-util.h"
@@ -18,6 +20,7 @@
#include "macro.h"
#include "parse-util.h"
#include "path-util.h"
+#include "path-util.h"
#include "random-util.h"
#include "string-util.h"
#include "strv.h"
@@ -698,92 +701,125 @@ int take_etc_passwd_lock(const char *root) {
return fd;
}
-bool valid_user_group_name_full(const char *u, bool strict) {
+bool valid_user_group_name(const char *u, ValidUserFlags flags) {
const char *i;
- long sz;
- bool warned = false;
- /* Checks if the specified name is a valid user/group name. Also see POSIX IEEE Std 1003.1-2008, 2016 Edition,
- * 3.437. We are a bit stricter here however. Specifically we deviate from POSIX rules:
+ /* Checks if the specified name is a valid user/group name. There are two flavours of this call:
+ * strict mode is the default which is POSIX plus some extra rules; and relaxed mode where we accept
+ * pretty much everything except the really worst offending names.
*
- * - We require that names fit into the appropriate utmp field
- * - We don't allow empty user names
- * - No dots in the first character
- *
- * If strict==true, additionally:
- * - We don't allow any dots (this conflicts with chown syntax which permits dots as user/group name separator)
- * - We don't allow a digit as the first character
- *
- * Note that other systems are even more restrictive, and don't permit underscores or uppercase characters.
- */
+ * Whenever we synthesize users ourselves we should use the strict mode. But when we process users
+ * created by other stuff, let's be more liberal. */
- if (isempty(u))
+ if (isempty(u)) /* An empty user name is never valid */
return false;
- if (!(u[0] >= 'a' && u[0] <= 'z') &&
- !(u[0] >= 'A' && u[0] <= 'Z') &&
- !(u[0] >= '0' && u[0] <= '9' && !strict) &&
- u[0] != '_')
- return false;
+ if (parse_uid(u, NULL) >= 0) /* Something that parses as numeric UID string is valid exactly when the
+ * flag for it is set */
+ return FLAGS_SET(flags, VALID_USER_ALLOW_NUMERIC);
- bool only_digits_seen = u[0] >= '0' && u[0] <= '9';
+ if (FLAGS_SET(flags, VALID_USER_RELAX)) {
- if (only_digits_seen) {
- log_warning("User or group name \"%s\" starts with a digit, accepting for compatibility.", u);
- warned = true;
+ /* In relaxed mode we just check very superficially. Apparently SSSD and other stuff is
+ * extremely liberal (way too liberal if you ask me, even inserting "@" in user names, which
+ * is bound to cause problems for example when used with an MTA), hence only filter the most
+ * obvious cases, or where things would result in an invalid entry if such a user name would
+ * show up in /etc/passwd (or equivalent getent output).
+ *
+ * Note that we stepped far out of POSIX territory here. It's not our fault though, but
+ * SSSD's, Samba's and everybody else who ignored POSIX on this. (I mean, I am happy to step
+ * outside of POSIX' bounds any day, but I must say in this case I probably wouldn't
+ * have...) */
+
+ if (startswith(u, " ") || endswith(u, " ")) /* At least expect whitespace padding is removed
+ * at front and back (accept in the middle, since
+ * that's apparently a thing on Windows). Note
+ * that this also blocks usernames consisting of
+ * whitespace only. */
+ return false;
+
+ if (!utf8_is_valid(u)) /* We want to synthesize JSON from this, hence insist on UTF-8 */
+ return false;
+
+ if (string_has_cc(u, NULL)) /* CC characters are just dangerous (and \n in particular is the
+ * record separator in /etc/passwd), so we can't allow that. */
+ return false;
+
+ if (strpbrk(u, ":/")) /* Colons are the field separator in /etc/passwd, we can't allow
+ * that. Slashes are special to file systems paths and user names
+ * typically show up in the file system as home directories, hence
+ * don't allow slashes. */
+ return false;
+
+ if (in_charset(u, "0123456789")) /* Don't allow fully numeric strings, they might be confused
+ * with with UIDs (note that this test is more broad than
+ * the parse_uid() test above, as it will cover more than
+ * the 32bit range, and it will detect 65535 (which is in
+ * invalid UID, even though in the unsigned 32 bit range) */
+ return false;
+
+ if (u[0] == '-' && in_charset(u + 1, "0123456789")) /* Don't allow negative fully numeric
+ * strings either. After all some people
+ * write 65535 as -1 (even though that's
+ * not even true on 32bit uid_t
+ * anyway) */
+ return false;
+
+ if (dot_or_dot_dot(u)) /* User names typically become home directory names, and these two are
+ * special in that context, don't allow that. */
+ return false;
+
+ /* Compare with strict result and warn if result doesn't match */
+ if (FLAGS_SET(flags, VALID_USER_WARN) && !valid_user_group_name(u, 0))
+ log_struct(LOG_NOTICE,
+ "MESSAGE=Accepting user/group name '%s', which does not match strict user/group name rules.", u,
+ "USER_GROUP_NAME=%s", u,
+ "MESSAGE_ID=" SD_MESSAGE_UNSAFE_USER_NAME_STR);
+
+ /* Note that we make no restrictions on the length in relaxed mode! */
+ } else {
+ long sz;
+ size_t l;
+
+ /* Also see POSIX IEEE Std 1003.1-2008, 2016 Edition, 3.437. We are a bit stricter here
+ * however. Specifically we deviate from POSIX rules:
+ *
+ * - We don't allow empty user names (see above)
+ * - We require that names fit into the appropriate utmp field
+ * - We don't allow any dots (this conflicts with chown syntax which permits dots as user/group name separator)
+ * - We don't allow dashes or digit as the first character
+ *
+ * Note that other systems are even more restrictive, and don't permit underscores or uppercase characters.
+ */
+
+ if (!(u[0] >= 'a' && u[0] <= 'z') &&
+ !(u[0] >= 'A' && u[0] <= 'Z') &&
+ u[0] != '_')
+ return false;
+
+ for (i = u+1; *i; i++)
+ if (!(*i >= 'a' && *i <= 'z') &&
+ !(*i >= 'A' && *i <= 'Z') &&
+ !(*i >= '0' && *i <= '9') &&
+ !IN_SET(*i, '_', '-'))
+ return false;
+
+ l = i - u;
+
+ sz = sysconf(_SC_LOGIN_NAME_MAX);
+ assert_se(sz > 0);
+
+ if (l > (size_t) sz)
+ return false;
+ if (l > FILENAME_MAX)
+ return false;
+ if (l > UT_NAMESIZE - 1)
+ return false;
}
- for (i = u+1; *i; i++) {
- if (((*i >= 'a' && *i <= 'z') ||
- (*i >= 'A' && *i <= 'Z') ||
- (*i >= '0' && *i <= '9') ||
- IN_SET(*i, '_', '-'))) {
- if (!(*i >= '0' && *i <= '9'))
- only_digits_seen = false;
- continue;
- }
-
- if (*i == '.' && !strict) {
- if (!warned) {
- log_warning("Bad user or group name \"%s\", accepting for compatibility.", u);
- warned = true;
- }
-
- continue;
- }
-
- return false;
- }
-
- if (only_digits_seen)
- return false;
-
- sz = sysconf(_SC_LOGIN_NAME_MAX);
- assert_se(sz > 0);
-
- if ((size_t) (i-u) > (size_t) sz)
- return false;
-
- if ((size_t) (i-u) > UT_NAMESIZE - 1)
- return false;
-
return true;
}
-bool valid_user_group_name_or_id_full(const char *u, bool strict) {
-
- /* Similar as above, but is also fine with numeric UID/GID specifications, as long as they are in the
- * right range, and not the invalid user ids. */
-
- if (isempty(u))
- return false;
-
- if (parse_uid(u, NULL) >= 0)
- return true;
-
- return valid_user_group_name_full(u, strict);
-}
-
bool valid_gecos(const char *d) {
if (!d)
diff --git a/src/basic/user-util.h b/src/basic/user-util.h
index 6796ac42c..1f267d21a 100644
--- a/src/basic/user-util.h
+++ b/src/basic/user-util.h
@@ -97,20 +97,13 @@ static inline bool userns_supported(void) {
return access("/proc/self/uid_map", F_OK) >= 0;
}
-bool valid_user_group_name_full(const char *u, bool strict);
-bool valid_user_group_name_or_id_full(const char *u, bool strict);
-static inline bool valid_user_group_name(const char *u) {
- return valid_user_group_name_full(u, true);
-}
-static inline bool valid_user_group_name_or_id(const char *u) {
- return valid_user_group_name_or_id_full(u, true);
-}
-static inline bool valid_user_group_name_compat(const char *u) {
- return valid_user_group_name_full(u, false);
-}
-static inline bool valid_user_group_name_or_id_compat(const char *u) {
- return valid_user_group_name_or_id_full(u, false);
-}
+typedef enum ValidUserFlags {
+ VALID_USER_RELAX = 1 << 0,
+ VALID_USER_WARN = 1 << 1,
+ VALID_USER_ALLOW_NUMERIC = 1 << 2,
+} ValidUserFlags;
+
+bool valid_user_group_name(const char *u, ValidUserFlags flags);
bool valid_gecos(const char *d);
bool valid_home(const char *p);
diff --git a/src/basic/virt.c b/src/basic/virt.c
index 07831634d..f56769626 100644
--- a/src/basic/virt.c
+++ b/src/basic/virt.c
@@ -462,13 +462,14 @@ int detect_container(void) {
goto finish;
}
- /* "Official" way of detecting WSL https://github.com/Microsoft/WSL/issues/423#issuecomment-221627364 */
+ /* "Official" way of detecting WSL https://github.com/Microsoft/WSL/issues/423#issuecomment-221627364,
+ * ... and a working one, since the official one doesn't actually work ;(
+ */
r = read_one_line_file("/proc/sys/kernel/osrelease", &o);
- if (r >= 0) {
- if (strstr(o, "Microsoft") || strstr(o, "WSL")) {
- r = VIRTUALIZATION_WSL;
- goto finish;
- }
+ if (r >= 0 &&
+ (strstr(o, "Microsoft") || strstr(o, "microsoft") || strstr(o, "WSL"))) {
+ r = VIRTUALIZATION_WSL;
+ goto finish;
}
if (getpid_cached() == 1) {
diff --git a/src/core/dbus-execute.c b/src/core/dbus-execute.c
index e8be76e31..93857436b 100644
--- a/src/core/dbus-execute.c
+++ b/src/core/dbus-execute.c
@@ -795,6 +795,7 @@ const sd_bus_vtable bus_exec_vtable[] = {
SD_BUS_PROPERTY("MountFlags", "t", bus_property_get_ulong, offsetof(ExecContext, mount_flags), SD_BUS_VTABLE_PROPERTY_CONST),
SD_BUS_PROPERTY("PrivateTmp", "b", bus_property_get_bool, offsetof(ExecContext, private_tmp), SD_BUS_VTABLE_PROPERTY_CONST),
SD_BUS_PROPERTY("PrivateDevices", "b", bus_property_get_bool, offsetof(ExecContext, private_devices), SD_BUS_VTABLE_PROPERTY_CONST),
+ SD_BUS_PROPERTY("ProtectClock", "b", bus_property_get_bool, offsetof(ExecContext, protect_clock), SD_BUS_VTABLE_PROPERTY_CONST),
SD_BUS_PROPERTY("ProtectKernelTunables", "b", bus_property_get_bool, offsetof(ExecContext, protect_kernel_tunables), SD_BUS_VTABLE_PROPERTY_CONST),
SD_BUS_PROPERTY("ProtectKernelModules", "b", bus_property_get_bool, offsetof(ExecContext, protect_kernel_modules), SD_BUS_VTABLE_PROPERTY_CONST),
SD_BUS_PROPERTY("ProtectKernelLogs", "b", bus_property_get_bool, offsetof(ExecContext, protect_kernel_logs), SD_BUS_VTABLE_PROPERTY_CONST),
@@ -1203,10 +1204,10 @@ int bus_exec_context_set_transient_property(
flags |= UNIT_PRIVATE;
if (streq(name, "User"))
- return bus_set_transient_user_compat(u, name, &c->user, message, flags, error);
+ return bus_set_transient_user_relaxed(u, name, &c->user, message, flags, error);
if (streq(name, "Group"))
- return bus_set_transient_user_compat(u, name, &c->group, message, flags, error);
+ return bus_set_transient_user_relaxed(u, name, &c->group, message, flags, error);
if (streq(name, "TTYPath"))
return bus_set_transient_path(u, name, &c->tty_path, message, flags, error);
@@ -1391,7 +1392,7 @@ int bus_exec_context_set_transient_property(
return r;
STRV_FOREACH(p, l)
- if (!isempty(*p) && !valid_user_group_name_or_id_compat(*p))
+ if (!isempty(*p) && !valid_user_group_name(*p, VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX|VALID_USER_WARN))
return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS,
"Invalid supplementary group names");
diff --git a/src/core/dbus-manager.c b/src/core/dbus-manager.c
index 60f55aef5..ef4bb316c 100644
--- a/src/core/dbus-manager.c
+++ b/src/core/dbus-manager.c
@@ -1643,7 +1643,7 @@ static int method_lookup_dynamic_user_by_name(sd_bus_message *message, void *use
if (!MANAGER_IS_SYSTEM(m))
return sd_bus_error_setf(error, SD_BUS_ERROR_NOT_SUPPORTED, "Dynamic users are only supported in the system instance.");
- if (!valid_user_group_name(name))
+ if (!valid_user_group_name(name, VALID_USER_RELAX))
return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "User name invalid: %s", name);
r = dynamic_user_lookup_name(m, name, &uid);
diff --git a/src/core/dbus-socket.c b/src/core/dbus-socket.c
index c8253c794..ad7b41a95 100644
--- a/src/core/dbus-socket.c
+++ b/src/core/dbus-socket.c
@@ -278,10 +278,10 @@ static int bus_socket_set_transient_property(
return bus_set_transient_fdname(u, name, &s->fdname, message, flags, error);
if (streq(name, "SocketUser"))
- return bus_set_transient_user_compat(u, name, &s->user, message, flags, error);
+ return bus_set_transient_user_relaxed(u, name, &s->user, message, flags, error);
if (streq(name, "SocketGroup"))
- return bus_set_transient_user_compat(u, name, &s->group, message, flags, error);
+ return bus_set_transient_user_relaxed(u, name, &s->group, message, flags, error);
if (streq(name, "BindIPv6Only"))
return bus_set_transient_bind_ipv6_only(u, name, &s->bind_ipv6_only, message, flags, error);
diff --git a/src/core/dbus-util.c b/src/core/dbus-util.c
index 7862beaac..951450e53 100644
--- a/src/core/dbus-util.c
+++ b/src/core/dbus-util.c
@@ -30,7 +30,12 @@ int bus_property_get_triggered_unit(
BUS_DEFINE_SET_TRANSIENT(mode_t, "u", uint32_t, mode_t, "%040o");
BUS_DEFINE_SET_TRANSIENT(unsigned, "u", uint32_t, unsigned, "%" PRIu32);
-BUS_DEFINE_SET_TRANSIENT_STRING_WITH_CHECK(user_compat, valid_user_group_name_or_id_compat);
+
+static inline bool valid_user_group_name_or_id_relaxed(const char *u) {
+ return valid_user_group_name(u, VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX);
+}
+
+BUS_DEFINE_SET_TRANSIENT_STRING_WITH_CHECK(user_relaxed, valid_user_group_name_or_id_relaxed);
BUS_DEFINE_SET_TRANSIENT_STRING_WITH_CHECK(path, path_is_absolute);
int bus_set_transient_string(
diff --git a/src/core/dbus-util.h b/src/core/dbus-util.h
index ec8c245ff..654ceb527 100644
--- a/src/core/dbus-util.h
+++ b/src/core/dbus-util.h
@@ -236,7 +236,7 @@ int bus_property_get_triggered_unit(sd_bus *bus, const char *path, const char *i
int bus_set_transient_mode_t(Unit *u, const char *name, mode_t *p, sd_bus_message *message, UnitWriteFlags flags, sd_bus_error *error);
int bus_set_transient_unsigned(Unit *u, const char *name, unsigned *p, sd_bus_message *message, UnitWriteFlags flags, sd_bus_error *error);
-int bus_set_transient_user_compat(Unit *u, const char *name, char **p, sd_bus_message *message, UnitWriteFlags flags, sd_bus_error *error);
+int bus_set_transient_user_relaxed(Unit *u, const char *name, char **p, sd_bus_message *message, UnitWriteFlags flags, sd_bus_error *error);
int bus_set_transient_path(Unit *u, const char *name, char **p, sd_bus_message *message, UnitWriteFlags flags, sd_bus_error *error);
int bus_set_transient_string(Unit *u, const char *name, char **p, sd_bus_message *message, UnitWriteFlags flags, sd_bus_error *error);
int bus_set_transient_bool(Unit *u, const char *name, bool *p, sd_bus_message *message, UnitWriteFlags flags, sd_bus_error *error);
diff --git a/src/core/dynamic-user.c b/src/core/dynamic-user.c
index f1819b36b..58b37925b 100644
--- a/src/core/dynamic-user.c
+++ b/src/core/dynamic-user.c
@@ -116,7 +116,7 @@ static int dynamic_user_acquire(Manager *m, const char *name, DynamicUser** ret)
return 0;
}
- if (!valid_user_group_name_or_id(name))
+ if (!valid_user_group_name(name, VALID_USER_ALLOW_NUMERIC))
return -EINVAL;
if (socketpair(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0, storage_socket) < 0)
diff --git a/src/core/execute.c b/src/core/execute.c
index 3d50a0857..2a65ee3fb 100644
--- a/src/core/execute.c
+++ b/src/core/execute.c
@@ -1577,7 +1577,7 @@ static int apply_protect_kernel_logs(const Unit *u, const ExecContext *c) {
return seccomp_protect_syslog();
}
-static int apply_protect_clock(const Unit *u, const ExecContext *c) {
+static int apply_protect_clock(const Unit *u, const ExecContext *c) {
assert(u);
assert(c);
@@ -1646,6 +1646,41 @@ static int apply_lock_personality(const Unit* u, const ExecContext *c) {
#endif
+static int apply_protect_hostname(const Unit *u, const ExecContext *c, int *ret_exit_status) {
+ int r;
+
+ assert(u);
+ assert(c);
+
+ if (!c->protect_hostname)
+ return 0;
+
+ if (ns_type_supported(NAMESPACE_UTS)) {
+ if (unshare(CLONE_NEWUTS) < 0) {
+ if (!ERRNO_IS_NOT_SUPPORTED(errno) && !ERRNO_IS_PRIVILEGE(errno)) {
+ *ret_exit_status = EXIT_NAMESPACE;
+ return log_unit_error_errno(u, errno, "Failed to set up UTS namespacing: %m");
+ }
+
+ log_unit_warning(u, "ProtectHostname=yes is configured, but UTS namespace setup is prohibited (container manager?), ignoring namespace setup.");
+ }
+ } else
+ log_unit_warning(u, "ProtectHostname=yes is configured, but the kernel does not support UTS namespaces, ignoring namespace setup.");
+
+#if HAVE_SECCOMP
+ if (skip_seccomp_unavailable(u, "ProtectHostname="))
+ return 0;
+
+ r = seccomp_protect_hostname();
+ if (r < 0) {
+ *ret_exit_status = EXIT_SECCOMP;
+ return log_unit_error_errno(u, r, "Failed to apply hostname restrictions: %m");
+ }
+#endif
+
+ return 0;
+}
+
static void do_idle_pipe_dance(int idle_pipe[static 4]) {
assert(idle_pipe);
@@ -3588,25 +3623,10 @@ static int exec_child(
}
}
- if (context->protect_hostname) {
- if (ns_type_supported(NAMESPACE_UTS)) {
- if (unshare(CLONE_NEWUTS) < 0) {
- if (!ERRNO_IS_NOT_SUPPORTED(errno) && !ERRNO_IS_PRIVILEGE(errno)) {
- *exit_status = EXIT_NAMESPACE;
- return log_unit_error_errno(unit, errno, "Failed to set up UTS namespacing: %m");
- }
-
- log_unit_warning(unit, "ProtectHostname=yes is configured, but UTS namespace setup is prohibited (container manager?), ignoring namespace setup.");
- }
- } else
- log_unit_warning(unit, "ProtectHostname=yes is configured, but the kernel does not support UTS namespaces, ignoring namespace setup.");
-#if HAVE_SECCOMP
- r = seccomp_protect_hostname();
- if (r < 0) {
- *exit_status = EXIT_SECCOMP;
- return log_unit_error_errno(unit, r, "Failed to apply hostname restrictions: %m");
- }
-#endif
+ if (needs_sandboxing) {
+ r = apply_protect_hostname(unit, context, exit_status);
+ if (r < 0)
+ return r;
}
/* Drop groups as early as possible.
diff --git a/src/core/load-fragment.c b/src/core/load-fragment.c
index 646364eb8..f3fe73535 100644
--- a/src/core/load-fragment.c
+++ b/src/core/load-fragment.c
@@ -2068,7 +2068,7 @@ int config_parse_user_group_compat(
return -ENOEXEC;
}
- if (!valid_user_group_name_or_id_compat(k)) {
+ if (!valid_user_group_name(k, VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX|VALID_USER_WARN)) {
log_syntax(unit, LOG_ERR, filename, line, 0, "Invalid user/group name or numeric ID: %s", k);
return -ENOEXEC;
}
@@ -2122,7 +2122,7 @@ int config_parse_user_group_strv_compat(
return -ENOEXEC;
}
- if (!valid_user_group_name_or_id_compat(k)) {
+ if (!valid_user_group_name(k, VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX|VALID_USER_WARN)) {
log_syntax(unit, LOG_ERR, filename, line, 0, "Invalid user/group name or numeric ID: %s", k);
return -ENOEXEC;
}
diff --git a/src/core/unit.c b/src/core/unit.c
index 2816bcef5..97e1b0004 100644
--- a/src/core/unit.c
+++ b/src/core/unit.c
@@ -4278,7 +4278,7 @@ static int user_from_unit_name(Unit *u, char **ret) {
if (r < 0)
return r;
- if (valid_user_group_name(n)) {
+ if (valid_user_group_name(n, 0)) {
*ret = TAKE_PTR(n);
return 0;
}
diff --git a/src/coredump/coredumpctl.c b/src/coredump/coredumpctl.c
index ed1246496..a84826817 100644
--- a/src/coredump/coredumpctl.c
+++ b/src/coredump/coredumpctl.c
@@ -17,6 +17,7 @@
#include "def.h"
#include "fd-util.h"
#include "fs-util.h"
+#include "glob-util.h"
#include "journal-internal.h"
#include "journal-util.h"
#include "log.h"
@@ -44,6 +45,7 @@ static usec_t arg_since = USEC_INFINITY, arg_until = USEC_INFINITY;
static const char* arg_field = NULL;
static const char *arg_debugger = NULL;
static const char *arg_directory = NULL;
+static char **arg_file = NULL;
static PagerFlags arg_pager_flags = 0;
static int arg_no_legend = false;
static int arg_one = false;
@@ -51,6 +53,8 @@ static const char* arg_output = NULL;
static bool arg_reverse = false;
static bool arg_quiet = false;
+STATIC_DESTRUCTOR_REGISTER(arg_file, strv_freep);
+
static int add_match(sd_journal *j, const char *match) {
_cleanup_free_ char *p = NULL;
const char* prefix, *pattern;
@@ -111,6 +115,10 @@ static int acquire_journal(sd_journal **ret, char **matches) {
r = sd_journal_open_directory(&j, arg_directory, 0);
if (r < 0)
return log_error_errno(r, "Failed to open journals in directory: %s: %m", arg_directory);
+ } else if (arg_file) {
+ r = sd_journal_open_files(&j, (const char**)arg_file, 0);
+ if (r < 0)
+ return log_error_errno(r, "Failed to open journal files: %m");
} else {
r = sd_journal_open(&j, SD_JOURNAL_LOCAL_ONLY);
if (r < 0)
@@ -164,6 +172,7 @@ static int help(void) {
" -r --reverse Show the newest entries first\n"
" -F --field=FIELD List all values a certain field takes\n"
" -o --output=FILE Write output to FILE\n"
+ " --file=PATH Use journal file\n"
" -D --directory=DIR Use journal files from directory\n\n"
" -q --quiet Do not show info messages and privilege warning\n"
"\nSee the %s for details.\n"
@@ -182,6 +191,7 @@ static int parse_argv(int argc, char *argv[]) {
ARG_NO_PAGER,
ARG_NO_LEGEND,
ARG_DEBUGGER,
+ ARG_FILE,
};
int c, r;
@@ -194,6 +204,7 @@ static int parse_argv(int argc, char *argv[]) {
{ "debugger", required_argument, NULL, ARG_DEBUGGER },
{ "output", required_argument, NULL, 'o' },
{ "field", required_argument, NULL, 'F' },
+ { "file", required_argument, NULL, ARG_FILE },
{ "directory", required_argument, NULL, 'D' },
{ "reverse", no_argument, NULL, 'r' },
{ "since", required_argument, NULL, 'S' },
@@ -225,6 +236,12 @@ static int parse_argv(int argc, char *argv[]) {
arg_debugger = optarg;
break;
+ case ARG_FILE:
+ r = glob_extend(&arg_file, optarg);
+ if (r < 0)
+ return log_error_errno(r, "Failed to add paths: %m");
+ break;
+
case 'o':
if (arg_output)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
@@ -1096,6 +1113,7 @@ static int run(int argc, char *argv[]) {
ansi_highlight_red(),
units_active, units_active == 1 ? "unit is running" : "units are running",
ansi_normal());
+
return r;
}
diff --git a/src/home/home-util.c b/src/home/home-util.c
index a53b0d339..69ab64548 100644
--- a/src/home/home-util.c
+++ b/src/home/home-util.c
@@ -17,7 +17,7 @@ bool suitable_user_name(const char *name) {
* restrictive, so that we can change the rules server-side without having to update things
* client-side too. */
- if (!valid_user_group_name(name))
+ if (!valid_user_group_name(name, 0))
return false;
/* We generally rely on NSS to tell us which users not to care for, but let's filter out some
diff --git a/src/home/homectl.c b/src/home/homectl.c
index 1ccc053d3..66d4bb6bd 100644
--- a/src/home/homectl.c
+++ b/src/home/homectl.c
@@ -540,7 +540,7 @@ static int inspect_home(int argc, char *argv[], void *userdata) {
r = parse_uid(*i, &uid);
if (r < 0) {
- if (!valid_user_group_name(*i)) {
+ if (!valid_user_group_name(*i, 0)) {
log_error("Invalid user name '%s'.", *i);
if (ret == 0)
ret = -EINVAL;
@@ -1395,7 +1395,7 @@ static int create_home(int argc, char *argv[], void *userdata) {
if (argc >= 2) {
/* If a username was specified, use it */
- if (valid_user_group_name(argv[1]))
+ if (valid_user_group_name(argv[1], 0))
r = json_variant_set_field_string(&arg_identity_extra, "userName", argv[1]);
else {
_cleanup_free_ char *un = NULL, *rr = NULL;
@@ -3357,7 +3357,7 @@ static int parse_argv(int argc, char *argv[]) {
if (r == 0)
break;
- if (!valid_user_group_name(word))
+ if (!valid_user_group_name(word, 0))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid group name %s.", word);
mo = json_variant_ref(json_variant_by_key(arg_identity_extra, "memberOf"));
diff --git a/src/home/homed-manager-bus.c b/src/home/homed-manager-bus.c
index fce854527..34a7b4945 100644
--- a/src/home/homed-manager-bus.c
+++ b/src/home/homed-manager-bus.c
@@ -81,7 +81,7 @@ static int method_get_home_by_name(
r = sd_bus_message_read(message, "s", &user_name);
if (r < 0)
return r;
- if (!valid_user_group_name(user_name))
+ if (!valid_user_group_name(user_name, 0))
return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "User name %s is not valid", user_name);
h = hashmap_get(m->homes_by_name, user_name);
@@ -212,7 +212,7 @@ static int method_get_user_record_by_name(
r = sd_bus_message_read(message, "s", &user_name);
if (r < 0)
return r;
- if (!valid_user_group_name(user_name))
+ if (!valid_user_group_name(user_name, 0))
return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "User name %s is not valid", user_name);
h = hashmap_get(m->homes_by_name, user_name);
@@ -287,7 +287,7 @@ static int generic_home_method(
if (r < 0)
return r;
- if (!valid_user_group_name(user_name))
+ if (!valid_user_group_name(user_name, 0))
return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "User name %s is not valid", user_name);
h = hashmap_get(m->homes_by_name, user_name);
diff --git a/src/home/pam_systemd_home.c b/src/home/pam_systemd_home.c
index 440ed85e2..9f34ee2ad 100644
--- a/src/home/pam_systemd_home.c
+++ b/src/home/pam_systemd_home.c
@@ -45,9 +45,12 @@ static int parse_argv(
else if (please_suspend)
*please_suspend = k;
+ } else if (streq(argv[i], "debug")) {
+ if (debug)
+ *debug = true;
+
} else if ((v = startswith(argv[i], "debug="))) {
int k;
-
k = parse_boolean(v);
if (k < 0)
pam_syslog(handle, LOG_WARNING, "Failed to parse debug= argument, ignoring: %s", v);
@@ -88,7 +91,7 @@ static int acquire_user_record(
/* Let's bypass all IPC complexity for the two user names we know for sure we don't manage, and for
* user names we don't consider valid. */
- if (STR_IN_SET(username, "root", NOBODY_USER_NAME) || !valid_user_group_name(username))
+ if (STR_IN_SET(username, "root", NOBODY_USER_NAME) || !valid_user_group_name(username, 0))
return PAM_USER_UNKNOWN;
/* Let's check if a previous run determined that this user is not managed by homed. If so, let's exit early */
diff --git a/src/journal-remote/journal-remote-main.c b/src/journal-remote/journal-remote-main.c
index 88e42d3a9..551b84130 100644
--- a/src/journal-remote/journal-remote-main.c
+++ b/src/journal-remote/journal-remote-main.c
@@ -786,7 +786,7 @@ static int help(void) {
" --listen-http=ADDR Listen for HTTP connections at ADDR\n"
" --listen-https=ADDR Listen for HTTPS connections at ADDR\n"
" -o --output=FILE|DIR Write output to FILE or DIR/external-*.journal\n"
- " --compress[=BOOL] XZ-compress the output journal (default: yes)\n"
+ " --compress[=BOOL] Use compression in the output journal (default: yes)\n"
" --seal[=BOOL] Use event sealing (default: no)\n"
" --key=FILENAME SSL key in PEM format (default:\n"
" \"" PRIV_KEY_FILE "\")\n"
diff --git a/src/libsystemd/sd-hwdb/hwdb-util.c b/src/libsystemd/sd-hwdb/hwdb-util.c
index d790e8fd0..5c7521695 100644
--- a/src/libsystemd/sd-hwdb/hwdb-util.c
+++ b/src/libsystemd/sd-hwdb/hwdb-util.c
@@ -488,7 +488,7 @@ static int import_file(struct trie *trie, const char *filename, uint16_t file_pr
size_t len;
char *pos;
- r = read_line(f, LONG_LINE_MAX, &line);
+ r = read_line_full(f, LONG_LINE_MAX, READ_LINE_NOT_A_TTY, &line);
if (r < 0)
return r;
if (r == 0)
diff --git a/src/login/logind-dbus.c b/src/login/logind-dbus.c
index 15201f900..047f83532 100644
--- a/src/login/logind-dbus.c
+++ b/src/login/logind-dbus.c
@@ -3170,6 +3170,12 @@ static int method_set_wall_message(
if (r < 0)
return r;
+ /* Short-circuit the operation if the desired state is already in place, to
+ * avoid an unnecessary polkit permission check. */
+ if (streq_ptr(m->wall_message, empty_to_null(wall_message)) &&
+ m->enable_wall_messages == enable_wall_messages)
+ goto done;
+
r = bus_verify_polkit_async(message,
CAP_SYS_ADMIN,
"org.freedesktop.login1.set-wall-message",
@@ -3189,6 +3195,7 @@ static int method_set_wall_message(
m->enable_wall_messages = enable_wall_messages;
+ done:
return sd_bus_reply_method_return(message, NULL);
}
diff --git a/src/network/netdev/fou-tunnel.c b/src/network/netdev/fou-tunnel.c
index 3cc273c7f..bc0dc185d 100644
--- a/src/network/netdev/fou-tunnel.c
+++ b/src/network/netdev/fou-tunnel.c
@@ -149,7 +149,10 @@ int config_parse_ip_protocol(
void *data,
void *userdata) {
- uint8_t *protocol = data;
+ uint8_t *ret = data;
+ unsigned protocol;
+ /* linux/fou.h defines the netlink field as one byte, so we need to reject protocols numbers that
+ * don't fit in one byte. */
int r;
assert(filename);
@@ -158,19 +161,26 @@ int config_parse_ip_protocol(
assert(rvalue);
assert(data);
- assert_cc(IPPROTO_MAX-1 <= UINT8_MAX);
-
r = parse_ip_protocol(rvalue);
- if (r < 0) {
- r = safe_atou8(rvalue, protocol);
+ if (r >= 0)
+ protocol = r;
+ else {
+ r = safe_atou(rvalue, &protocol);
if (r < 0)
log_syntax(unit, LOG_ERR, filename, line, r,
- "Failed to parse IP protocol '%s' for Foo over UDP tunnel, "
+ "Failed to parse IP protocol '%s' for FooOverUDP tunnel, "
"ignoring assignment: %m", rvalue);
return 0;
}
- *protocol = r;
+ if (protocol > UINT8_MAX) {
+ log_syntax(unit, LOG_ERR, filename, line, 0,
+ "IP protocol '%s' for FooOverUDP tunnel out of range, "
+ "ignoring assignment: %m", rvalue);
+ return 0;
+ }
+
+ *ret = protocol;
return 0;
}
@@ -203,7 +213,7 @@ int config_parse_fou_tunnel_address(
r = in_addr_from_string_auto(rvalue, f, addr);
if (r < 0)
log_syntax(unit, LOG_ERR, filename, line, r,
- "Foo over UDP tunnel '%s' address is invalid, ignoring assignment: %s",
+ "FooOverUDP tunnel '%s' address is invalid, ignoring assignment: %s",
lvalue, rvalue);
return 0;
diff --git a/src/nss-systemd/nss-systemd.c b/src/nss-systemd/nss-systemd.c
index 08fe100c0..6a38246f8 100644
--- a/src/nss-systemd/nss-systemd.c
+++ b/src/nss-systemd/nss-systemd.c
@@ -95,7 +95,7 @@ enum nss_status _nss_systemd_getpwnam_r(
/* If the username is not valid, then we don't know it. Ideally libc would filter these for us
* anyway. We don't generate EINVAL here, because it isn't really out business to complain about
* invalid user names. */
- if (!valid_user_group_name(name))
+ if (!valid_user_group_name(name, VALID_USER_RELAX))
return NSS_STATUS_NOTFOUND;
/* Synthesize entries for the root and nobody users, in case they are missing in /etc/passwd */
@@ -192,7 +192,7 @@ enum nss_status _nss_systemd_getgrnam_r(
assert(gr);
assert(errnop);
- if (!valid_user_group_name(name))
+ if (!valid_user_group_name(name, VALID_USER_RELAX))
return NSS_STATUS_NOTFOUND;
/* Synthesize records for root and nobody, in case they are missing from /etc/group */
@@ -559,7 +559,7 @@ enum nss_status _nss_systemd_initgroups_dyn(
assert(groupsp);
assert(errnop);
- if (!valid_user_group_name(user_name))
+ if (!valid_user_group_name(user_name, VALID_USER_RELAX))
return NSS_STATUS_NOTFOUND;
/* Don't allow extending these two special users, the same as we won't resolve them via getpwnam() */
diff --git a/src/resolve/resolved-etc-hosts.c b/src/resolve/resolved-etc-hosts.c
index e6bf20db5..c2839d425 100644
--- a/src/resolve/resolved-etc-hosts.c
+++ b/src/resolve/resolved-etc-hosts.c
@@ -37,6 +37,8 @@ void etc_hosts_free(EtcHosts *hosts) {
void manager_etc_hosts_flush(Manager *m) {
etc_hosts_free(&m->etc_hosts);
m->etc_hosts_mtime = USEC_INFINITY;
+ m->etc_hosts_ino = 0;
+ m->etc_hosts_dev = 0;
}
static int parse_line(EtcHosts *hosts, unsigned nr, const char *line) {
@@ -224,8 +226,9 @@ static int manager_etc_hosts_read(Manager *m) {
return 0;
}
- /* Did the mtime change? If not, there's no point in re-reading the file. */
- if (timespec_load(&st.st_mtim) == m->etc_hosts_mtime)
+ /* Did the mtime or ino/dev change? If not, there's no point in re-reading the file. */
+ if (timespec_load(&st.st_mtim) == m->etc_hosts_mtime &&
+ st.st_ino == m->etc_hosts_ino && st.st_dev == m->etc_hosts_dev)
return 0;
}
@@ -249,6 +252,8 @@ static int manager_etc_hosts_read(Manager *m) {
return r;
m->etc_hosts_mtime = timespec_load(&st.st_mtim);
+ m->etc_hosts_ino = st.st_ino;
+ m->etc_hosts_dev = st.st_dev;
m->etc_hosts_last = ts;
return 1;
diff --git a/src/resolve/resolved-manager.c b/src/resolve/resolved-manager.c
index 4f7207772..df25907a4 100644
--- a/src/resolve/resolved-manager.c
+++ b/src/resolve/resolved-manager.c
@@ -591,6 +591,8 @@ int manager_new(Manager **ret) {
.need_builtin_fallbacks = true,
.etc_hosts_last = USEC_INFINITY,
.etc_hosts_mtime = USEC_INFINITY,
+ .etc_hosts_ino = 0,
+ .etc_hosts_dev = 0,
.read_etc_hosts = true,
};
diff --git a/src/resolve/resolved-manager.h b/src/resolve/resolved-manager.h
index 7f7d3a6b9..446f258b4 100644
--- a/src/resolve/resolved-manager.h
+++ b/src/resolve/resolved-manager.h
@@ -127,6 +127,8 @@ struct Manager {
/* Data from /etc/hosts */
EtcHosts etc_hosts;
usec_t etc_hosts_last, etc_hosts_mtime;
+ ino_t etc_hosts_ino;
+ dev_t etc_hosts_dev;
bool read_etc_hosts;
/* Local DNS stub on 127.0.0.53:53 */
diff --git a/src/resolve/resolved-resolv-conf.c b/src/resolve/resolved-resolv-conf.c
index 7b487d50c..f5fc13563 100644
--- a/src/resolve/resolved-resolv-conf.c
+++ b/src/resolve/resolved-resolv-conf.c
@@ -283,9 +283,9 @@ static int write_uplink_resolv_conf_contents(FILE *f, OrderedSet *dns, OrderedSe
"# This is a dynamic resolv.conf file for connecting local clients directly to\n"
"# all known uplink DNS servers. This file lists all configured search domains.\n"
"#\n"
- "# Third party programs must not access this file directly, but only through the\n"
- "# symlink at /etc/resolv.conf. To manage man:resolv.conf(5) in a different way,\n"
- "# replace this symlink by a static file or a different symlink.\n"
+ "# Third party programs should typically not access this file directly, but only\n"
+ "# through the symlink at /etc/resolv.conf. To manage man:resolv.conf(5) in a\n"
+ "# different way, replace this symlink by a static file or a different symlink.\n"
"#\n"
"# See man:systemd-resolved.service(8) for details about the supported modes of\n"
"# operation for /etc/resolv.conf.\n"
@@ -308,24 +308,24 @@ static int write_uplink_resolv_conf_contents(FILE *f, OrderedSet *dns, OrderedSe
}
static int write_stub_resolv_conf_contents(FILE *f, OrderedSet *dns, OrderedSet *domains) {
- fputs_unlocked("# This file is managed by man:systemd-resolved(8). Do not edit.\n"
- "#\n"
- "# This is a dynamic resolv.conf file for connecting local clients to the\n"
- "# internal DNS stub resolver of systemd-resolved. This file lists all\n"
- "# configured search domains.\n"
- "#\n"
- "# Run \"resolvectl status\" to see details about the uplink DNS servers\n"
- "# currently in use.\n"
- "#\n"
- "# Third party programs must not access this file directly, but only through the\n"
- "# symlink at /etc/resolv.conf. To manage man:resolv.conf(5) in a different way,\n"
- "# replace this symlink by a static file or a different symlink.\n"
- "#\n"
- "# See man:systemd-resolved.service(8) for details about the supported modes of\n"
- "# operation for /etc/resolv.conf.\n"
- "\n"
- "nameserver 127.0.0.53\n"
- "options edns0\n", f);
+ fputs("# This file is managed by man:systemd-resolved(8). Do not edit.\n"
+ "#\n"
+ "# This is a dynamic resolv.conf file for connecting local clients to the\n"
+ "# internal DNS stub resolver of systemd-resolved. This file lists all\n"
+ "# configured search domains.\n"
+ "#\n"
+ "# Run \"resolvectl status\" to see details about the uplink DNS servers\n"
+ "# currently in use.\n"
+ "#\n"
+ "# Third party programs should typically not access this file directly, but only\n"
+ "# through the symlink at /etc/resolv.conf. To manage man:resolv.conf(5) in a\n"
+ "# different way, replace this symlink by a static file or a different symlink.\n"
+ "#\n"
+ "# See man:systemd-resolved.service(8) for details about the supported modes of\n"
+ "# operation for /etc/resolv.conf.\n"
+ "\n"
+ "nameserver 127.0.0.53\n"
+ "options edns0\n", f);
if (!ordered_set_isempty(domains))
write_resolv_conf_search(domains, f);
diff --git a/src/shared/conf-parser.c b/src/shared/conf-parser.c
index 657df0a51..3ba33606f 100644
--- a/src/shared/conf-parser.c
+++ b/src/shared/conf-parser.c
@@ -294,7 +294,7 @@ int config_parse(const char *unit,
_cleanup_fclose_ FILE *ours = NULL;
unsigned line = 0, section_line = 0;
bool section_ignored = false, bom_seen = false;
- int r;
+ int r, fd;
assert(filename);
assert(lookup);
@@ -311,7 +311,9 @@ int config_parse(const char *unit,
}
}
- fd_warn_permissions(filename, fileno(f));
+ fd = fileno(f);
+ if (fd >= 0) /* stream might not have an fd, let's be careful hence */
+ fd_warn_permissions(filename, fd);
for (;;) {
_cleanup_free_ char *buf = NULL;
diff --git a/src/shared/dissect-image.c b/src/shared/dissect-image.c
index 1ef69fdf4..34b6d44b4 100644
--- a/src/shared/dissect-image.c
+++ b/src/shared/dissect-image.c
@@ -1188,6 +1188,8 @@ static int decrypt_partition(
if (r < 0)
return log_debug_errno(r, "Failed to initialize dm-crypt: %m");
+ crypt_set_log_callback(cd, cryptsetup_log_glue, NULL);
+
r = crypt_load(cd, CRYPT_LUKS, NULL);
if (r < 0)
return log_debug_errno(r, "Failed to load LUKS metadata: %m");
@@ -1246,6 +1248,8 @@ static int verity_partition(
if (r < 0)
return r;
+ crypt_set_log_callback(cd, cryptsetup_log_glue, NULL);
+
r = crypt_load(cd, CRYPT_VERITY, NULL);
if (r < 0)
return r;
diff --git a/src/shared/group-record.c b/src/shared/group-record.c
index d5ec32f07..3c9520693 100644
--- a/src/shared/group-record.c
+++ b/src/shared/group-record.c
@@ -86,8 +86,8 @@ static int dispatch_per_machine(const char *name, JsonVariant *variant, JsonDisp
{ "matchMachineId", _JSON_VARIANT_TYPE_INVALID, NULL, 0, 0 },
{ "matchHostname", _JSON_VARIANT_TYPE_INVALID, NULL, 0, 0 },
{ "gid", JSON_VARIANT_UNSIGNED, json_dispatch_uid_gid, offsetof(GroupRecord, gid), 0 },
- { "members", JSON_VARIANT_ARRAY, json_dispatch_user_group_list, offsetof(GroupRecord, members), 0 },
- { "administrators", JSON_VARIANT_ARRAY, json_dispatch_user_group_list, offsetof(GroupRecord, administrators), 0 },
+ { "members", JSON_VARIANT_ARRAY, json_dispatch_user_group_list, offsetof(GroupRecord, members), JSON_RELAX},
+ { "administrators", JSON_VARIANT_ARRAY, json_dispatch_user_group_list, offsetof(GroupRecord, administrators), JSON_RELAX},
{},
};
@@ -190,14 +190,14 @@ int group_record_load(
UserRecordLoadFlags load_flags) {
static const JsonDispatch group_dispatch_table[] = {
- { "groupName", JSON_VARIANT_STRING, json_dispatch_user_group_name, offsetof(GroupRecord, group_name), 0 },
+ { "groupName", JSON_VARIANT_STRING, json_dispatch_user_group_name, offsetof(GroupRecord, group_name), JSON_RELAX},
{ "realm", JSON_VARIANT_STRING, json_dispatch_realm, offsetof(GroupRecord, realm), 0 },
{ "disposition", JSON_VARIANT_STRING, json_dispatch_user_disposition, offsetof(GroupRecord, disposition), 0 },
{ "service", JSON_VARIANT_STRING, json_dispatch_string, offsetof(GroupRecord, service), JSON_SAFE },
{ "lastChangeUSec", JSON_VARIANT_UNSIGNED, json_dispatch_uint64, offsetof(GroupRecord, last_change_usec), 0 },
{ "gid", JSON_VARIANT_UNSIGNED, json_dispatch_uid_gid, offsetof(GroupRecord, gid), 0 },
- { "members", JSON_VARIANT_ARRAY, json_dispatch_user_group_list, offsetof(GroupRecord, members), 0 },
- { "administrators", JSON_VARIANT_ARRAY, json_dispatch_user_group_list, offsetof(GroupRecord, administrators), 0 },
+ { "members", JSON_VARIANT_ARRAY, json_dispatch_user_group_list, offsetof(GroupRecord, members), JSON_RELAX},
+ { "administrators", JSON_VARIANT_ARRAY, json_dispatch_user_group_list, offsetof(GroupRecord, administrators), JSON_RELAX},
{ "privileged", JSON_VARIANT_OBJECT, dispatch_privileged, 0, 0 },
diff --git a/src/shared/json.c b/src/shared/json.c
index e28a5df19..7a79acdee 100644
--- a/src/shared/json.c
+++ b/src/shared/json.c
@@ -4107,7 +4107,7 @@ int json_dispatch_user_group_name(const char *name, JsonVariant *variant, JsonDi
return json_log(variant, flags, SYNTHETIC_ERRNO(EINVAL), "JSON field '%s' is not a string.", strna(name));
n = json_variant_string(variant);
- if (!valid_user_group_name_compat(n))
+ if (!valid_user_group_name(n, FLAGS_SET(flags, JSON_RELAX) ? VALID_USER_RELAX : 0))
return json_log(variant, flags, SYNTHETIC_ERRNO(EINVAL), "JSON field '%s' is not a valid user/group name.", strna(name));
r = free_and_strdup(s, n);
diff --git a/src/shared/json.h b/src/shared/json.h
index b9b300a1d..a4e5b6f50 100644
--- a/src/shared/json.h
+++ b/src/shared/json.h
@@ -255,6 +255,7 @@ typedef enum JsonDispatchFlags {
JSON_MANDATORY = 1 << 1, /* Should existence of this property be mandatory? */
JSON_LOG = 1 << 2, /* Should the parser log about errors? */
JSON_SAFE = 1 << 3, /* Don't accept "unsafe" strings in json_dispatch_string() + json_dispatch_string() */
+ JSON_RELAX = 1 << 4, /* Use relaxed user name checking in json_dispatch_user_group_name */
/* The following two may be passed into log_json() in addition to the three above */
JSON_DEBUG = 1 << 4, /* Indicates that this log message is a debug message */
diff --git a/src/shared/sleep-config.c b/src/shared/sleep-config.c
index e63ef0f26..6dbdff7b2 100644
--- a/src/shared/sleep-config.c
+++ b/src/shared/sleep-config.c
@@ -223,7 +223,7 @@ static int calculate_swap_file_offset(const SwapEntry *swap, uint64_t *ret_offse
fd = open(swap->device, O_RDONLY|O_CLOEXEC|O_NOCTTY);
if (fd < 0)
- return log_error_errno(errno, "Failed to open %s: %m", swap->device);
+ return log_error_errno(errno, "Failed to open swap file %s to determine on-disk offset: %m", swap->device);
if (fstat(fd, &sb) < 0)
return log_error_errno(errno, "Failed to stat %s: %m", swap->device);
diff --git a/src/shared/user-record.c b/src/shared/user-record.c
index ff2cc4114..080c2a140 100644
--- a/src/shared/user-record.c
+++ b/src/shared/user-record.c
@@ -600,7 +600,7 @@ int json_dispatch_user_group_list(const char *name, JsonVariant *variant, JsonDi
if (!json_variant_is_string(e))
return json_log(e, flags, SYNTHETIC_ERRNO(EINVAL), "JSON array element is not a string.");
- if (!valid_user_group_name_compat(json_variant_string(e)))
+ if (!valid_user_group_name(json_variant_string(e), FLAGS_SET(flags, JSON_RELAX) ? VALID_USER_RELAX : 0))
return json_log(e, flags, SYNTHETIC_ERRNO(EINVAL), "JSON array element is not a valid user/group name: %s", json_variant_string(e));
r = strv_extend(&l, json_variant_string(e));
@@ -938,7 +938,7 @@ static int dispatch_per_machine(const char *name, JsonVariant *variant, JsonDisp
{ "imagePath", JSON_VARIANT_STRING, json_dispatch_path, offsetof(UserRecord, image_path), 0 },
{ "uid", JSON_VARIANT_UNSIGNED, json_dispatch_uid_gid, offsetof(UserRecord, uid), 0 },
{ "gid", JSON_VARIANT_UNSIGNED, json_dispatch_uid_gid, offsetof(UserRecord, gid), 0 },
- { "memberOf", JSON_VARIANT_ARRAY, json_dispatch_user_group_list, offsetof(UserRecord, member_of), 0 },
+ { "memberOf", JSON_VARIANT_ARRAY, json_dispatch_user_group_list, offsetof(UserRecord, member_of), JSON_RELAX},
{ "fileSystemType", JSON_VARIANT_STRING, json_dispatch_string, offsetof(UserRecord, file_system_type), JSON_SAFE },
{ "partitionUuid", JSON_VARIANT_STRING, json_dispatch_id128, offsetof(UserRecord, partition_uuid), 0 },
{ "luksUuid", JSON_VARIANT_STRING, json_dispatch_id128, offsetof(UserRecord, luks_uuid), 0 },
@@ -1231,7 +1231,7 @@ int user_group_record_mangle(
int user_record_load(UserRecord *h, JsonVariant *v, UserRecordLoadFlags load_flags) {
static const JsonDispatch user_dispatch_table[] = {
- { "userName", JSON_VARIANT_STRING, json_dispatch_user_group_name, offsetof(UserRecord, user_name), 0 },
+ { "userName", JSON_VARIANT_STRING, json_dispatch_user_group_name, offsetof(UserRecord, user_name), JSON_RELAX},
{ "realm", JSON_VARIANT_STRING, json_dispatch_realm, offsetof(UserRecord, realm), 0 },
{ "realName", JSON_VARIANT_STRING, json_dispatch_gecos, offsetof(UserRecord, real_name), 0 },
{ "emailAddress", JSON_VARIANT_STRING, json_dispatch_string, offsetof(UserRecord, email_address), JSON_SAFE },
@@ -1270,7 +1270,7 @@ int user_record_load(UserRecord *h, JsonVariant *v, UserRecordLoadFlags load_fla
{ "homeDirectory", JSON_VARIANT_STRING, json_dispatch_home_directory, offsetof(UserRecord, home_directory), 0 },
{ "uid", JSON_VARIANT_UNSIGNED, json_dispatch_uid_gid, offsetof(UserRecord, uid), 0 },
{ "gid", JSON_VARIANT_UNSIGNED, json_dispatch_uid_gid, offsetof(UserRecord, gid), 0 },
- { "memberOf", JSON_VARIANT_ARRAY, json_dispatch_user_group_list, offsetof(UserRecord, member_of), 0 },
+ { "memberOf", JSON_VARIANT_ARRAY, json_dispatch_user_group_list, offsetof(UserRecord, member_of), JSON_RELAX},
{ "fileSystemType", JSON_VARIANT_STRING, json_dispatch_string, offsetof(UserRecord, file_system_type), JSON_SAFE },
{ "partitionUuid", JSON_VARIANT_STRING, json_dispatch_id128, offsetof(UserRecord, partition_uuid), 0 },
{ "luksUuid", JSON_VARIANT_STRING, json_dispatch_id128, offsetof(UserRecord, luks_uuid), 0 },
diff --git a/src/shared/userdb.c b/src/shared/userdb.c
index 92f879676..0769a792c 100644
--- a/src/shared/userdb.c
+++ b/src/shared/userdb.c
@@ -587,7 +587,7 @@ int userdb_by_name(const char *name, UserDBFlags flags, UserRecord **ret) {
_cleanup_(json_variant_unrefp) JsonVariant *query = NULL;
int r;
- if (!valid_user_group_name_compat(name))
+ if (!valid_user_group_name(name, VALID_USER_RELAX))
return -EINVAL;
r = json_build(&query, JSON_BUILD_OBJECT(
@@ -795,7 +795,7 @@ int groupdb_by_name(const char *name, UserDBFlags flags, GroupRecord **ret) {
_cleanup_(json_variant_unrefp) JsonVariant *query = NULL;
int r;
- if (!valid_user_group_name_compat(name))
+ if (!valid_user_group_name(name, VALID_USER_RELAX))
return -EINVAL;
r = json_build(&query, JSON_BUILD_OBJECT(
@@ -982,7 +982,7 @@ int membershipdb_by_user(const char *name, UserDBFlags flags, UserDBIterator **r
assert(ret);
- if (!valid_user_group_name_compat(name))
+ if (!valid_user_group_name(name, VALID_USER_RELAX))
return -EINVAL;
r = json_build(&query, JSON_BUILD_OBJECT(
@@ -1025,7 +1025,7 @@ int membershipdb_by_group(const char *name, UserDBFlags flags, UserDBIterator **
assert(ret);
- if (!valid_user_group_name_compat(name))
+ if (!valid_user_group_name(name, VALID_USER_RELAX))
return -EINVAL;
r = json_build(&query, JSON_BUILD_OBJECT(
diff --git a/src/systemd/sd-messages.h b/src/systemd/sd-messages.h
index e8d26ab71..162b650e6 100644
--- a/src/systemd/sd-messages.h
+++ b/src/systemd/sd-messages.h
@@ -158,6 +158,9 @@ _SD_BEGIN_DECLARATIONS;
#define SD_MESSAGE_DNSSEC_DOWNGRADE SD_ID128_MAKE(36,db,2d,fa,5a,90,45,e1,bd,4a,f5,f9,3e,1c,f0,57)
#define SD_MESSAGE_DNSSEC_DOWNGRADE_STR SD_ID128_MAKE_STR(36,db,2d,fa,5a,90,45,e1,bd,4a,f5,f9,3e,1c,f0,57)
+#define SD_MESSAGE_UNSAFE_USER_NAME SD_ID128_MAKE(b6,1f,da,c6,12,e9,4b,91,82,28,5b,99,88,43,06,1f)
+#define SD_MESSAGE_UNSAFE_USER_NAME_STR SD_ID128_MAKE_STR(b6,1f,da,c6,12,e9,4b,91,82,28,5b,99,88,43,06,1f)
+
_SD_END_DECLARATIONS;
#endif
diff --git a/src/sysusers/sysusers.c b/src/sysusers/sysusers.c
index f7cc7e090..c3e5457fc 100644
--- a/src/sysusers/sysusers.c
+++ b/src/sysusers/sysusers.c
@@ -1445,7 +1445,7 @@ static int parse_line(const char *fname, unsigned line, const char *buffer) {
if (r < 0)
log_error_errno(r, "[%s:%u] Failed to replace specifiers: %s", fname, line, name);
- if (!valid_user_group_name(resolved_name))
+ if (!valid_user_group_name(resolved_name, 0))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"[%s:%u] '%s' is not a valid user or group name.",
fname, line, resolved_name);
@@ -1548,7 +1548,7 @@ static int parse_line(const char *fname, unsigned line, const char *buffer) {
"[%s:%u] Lines of type 'm' require a group name in the third field.",
fname, line);
- if (!valid_user_group_name(resolved_id))
+ if (!valid_user_group_name(resolved_id, 0))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"[%s:%u] '%s' is not a valid user or group name.",
fname, line, resolved_id);
@@ -1589,7 +1589,7 @@ static int parse_line(const char *fname, unsigned line, const char *buffer) {
if (split_pair(resolved_id, ":", &uid, &gid) == 0) {
r = parse_gid(gid, &i->gid);
if (r < 0) {
- if (valid_user_group_name(gid))
+ if (valid_user_group_name(gid, 0))
i->group_name = TAKE_PTR(gid);
else
return log_error_errno(r, "Failed to parse GID: '%s': %m", id);
diff --git a/src/test/meson.build b/src/test/meson.build
index b79b197c1..a150ee106 100644
--- a/src/test/meson.build
+++ b/src/test/meson.build
@@ -1123,6 +1123,10 @@ tests += [
[],
[]],
+ [['src/analyze/test-verify.c', 'src/analyze/analyze-verify.c', 'src/analyze/analyze-verify.h'],
+ [libcore, libshared],
+ []],
+
[['src/login/test-inhibit.c'],
[],
[],
diff --git a/src/test/test-strv.c b/src/test/test-strv.c
index dd6233175..e48d419f5 100644
--- a/src/test/test-strv.c
+++ b/src/test/test-strv.c
@@ -307,6 +307,12 @@ static void test_strv_split(void) {
l = strv_split_full(" 'one' \" two\t three \"' four five", NULL, SPLIT_QUOTES | SPLIT_RELAX);
assert_se(l);
assert_se(strv_equal(l, (char**) input_table_quoted));
+
+ strv_free_erase(l);
+
+ l = strv_split_full("\\", NULL, SPLIT_QUOTES | SPLIT_RELAX);
+ assert_se(l);
+ assert_se(strv_equal(l, STRV_MAKE("\\")));
}
static void test_strv_split_empty(void) {
diff --git a/src/test/test-user-util.c b/src/test/test-user-util.c
index 11c01e518..a0e149518 100644
--- a/src/test/test-user-util.c
+++ b/src/test/test-user-util.c
@@ -63,144 +63,163 @@ static void test_uid_ptr(void) {
assert_se(PTR_TO_UID(UID_TO_PTR(1000)) == 1000);
}
-static void test_valid_user_group_name_compat(void) {
+static void test_valid_user_group_name_relaxed(void) {
log_info("/* %s */", __func__);
- assert_se(!valid_user_group_name_compat(NULL));
- assert_se(!valid_user_group_name_compat(""));
- assert_se(!valid_user_group_name_compat("1"));
- assert_se(!valid_user_group_name_compat("65535"));
- assert_se(!valid_user_group_name_compat("-1"));
- assert_se(!valid_user_group_name_compat("-kkk"));
- assert_se(!valid_user_group_name_compat("rööt"));
- assert_se(!valid_user_group_name_compat("."));
- assert_se(!valid_user_group_name_compat(".eff"));
- assert_se(!valid_user_group_name_compat("foo\nbar"));
- assert_se(!valid_user_group_name_compat("0123456789012345678901234567890123456789"));
- assert_se(!valid_user_group_name_or_id_compat("aaa:bbb"));
- assert_se(!valid_user_group_name_compat("."));
- assert_se(!valid_user_group_name_compat(".1"));
- assert_se(!valid_user_group_name_compat(".65535"));
- assert_se(!valid_user_group_name_compat(".-1"));
- assert_se(!valid_user_group_name_compat(".-kkk"));
- assert_se(!valid_user_group_name_compat(".rööt"));
- assert_se(!valid_user_group_name_or_id_compat(".aaa:bbb"));
+ assert_se(!valid_user_group_name(NULL, VALID_USER_RELAX));
+ assert_se(!valid_user_group_name("", VALID_USER_RELAX));
+ assert_se(!valid_user_group_name("1", VALID_USER_RELAX));
+ assert_se(!valid_user_group_name("65535", VALID_USER_RELAX));
+ assert_se(!valid_user_group_name("-1", VALID_USER_RELAX));
+ assert_se(!valid_user_group_name("foo\nbar", VALID_USER_RELAX));
+ assert_se(!valid_user_group_name("0123456789012345678901234567890123456789", VALID_USER_RELAX));
+ assert_se(!valid_user_group_name("aaa:bbb", VALID_USER_RELAX|VALID_USER_ALLOW_NUMERIC));
+ assert_se(!valid_user_group_name(".aaa:bbb", VALID_USER_RELAX|VALID_USER_ALLOW_NUMERIC));
+ assert_se(!valid_user_group_name(".", VALID_USER_RELAX));
+ assert_se(!valid_user_group_name("..", VALID_USER_RELAX));
- assert_se(valid_user_group_name_compat("root"));
- assert_se(valid_user_group_name_compat("lennart"));
- assert_se(valid_user_group_name_compat("LENNART"));
- assert_se(valid_user_group_name_compat("_kkk"));
- assert_se(valid_user_group_name_compat("kkk-"));
- assert_se(valid_user_group_name_compat("kk-k"));
- assert_se(valid_user_group_name_compat("eff.eff"));
- assert_se(valid_user_group_name_compat("eff."));
+ assert_se(valid_user_group_name("root", VALID_USER_RELAX));
+ assert_se(valid_user_group_name("lennart", VALID_USER_RELAX));
+ assert_se(valid_user_group_name("LENNART", VALID_USER_RELAX));
+ assert_se(valid_user_group_name("_kkk", VALID_USER_RELAX));
+ assert_se(valid_user_group_name("kkk-", VALID_USER_RELAX));
+ assert_se(valid_user_group_name("kk-k", VALID_USER_RELAX));
+ assert_se(valid_user_group_name("eff.eff", VALID_USER_RELAX));
+ assert_se(valid_user_group_name("eff.", VALID_USER_RELAX));
+ assert_se(valid_user_group_name("-kkk", VALID_USER_RELAX));
+ assert_se(valid_user_group_name("rööt", VALID_USER_RELAX));
+ assert_se(valid_user_group_name(".eff", VALID_USER_RELAX));
+ assert_se(valid_user_group_name(".1", VALID_USER_RELAX));
+ assert_se(valid_user_group_name(".65535", VALID_USER_RELAX));
+ assert_se(valid_user_group_name(".-1", VALID_USER_RELAX));
+ assert_se(valid_user_group_name(".-kkk", VALID_USER_RELAX));
+ assert_se(valid_user_group_name(".rööt", VALID_USER_RELAX));
+ assert_se(valid_user_group_name("...", VALID_USER_RELAX));
- assert_se(valid_user_group_name_compat("some5"));
- assert_se(valid_user_group_name_compat("5some"));
- assert_se(valid_user_group_name_compat("INNER5NUMBER"));
+ assert_se(valid_user_group_name("some5", VALID_USER_RELAX));
+ assert_se(valid_user_group_name("5some", VALID_USER_RELAX));
+ assert_se(valid_user_group_name("INNER5NUMBER", VALID_USER_RELAX));
+
+ assert_se(valid_user_group_name("piff.paff@ad.domain.example", VALID_USER_RELAX));
+ assert_se(valid_user_group_name("Dāvis", VALID_USER_RELAX));
}
static void test_valid_user_group_name(void) {
log_info("/* %s */", __func__);
- assert_se(!valid_user_group_name(NULL));
- assert_se(!valid_user_group_name(""));
- assert_se(!valid_user_group_name("1"));
- assert_se(!valid_user_group_name("65535"));
- assert_se(!valid_user_group_name("-1"));
- assert_se(!valid_user_group_name("-kkk"));
- assert_se(!valid_user_group_name("rööt"));
- assert_se(!valid_user_group_name("."));
- assert_se(!valid_user_group_name(".eff"));
- assert_se(!valid_user_group_name("foo\nbar"));
- assert_se(!valid_user_group_name("0123456789012345678901234567890123456789"));
- assert_se(!valid_user_group_name_or_id("aaa:bbb"));
- assert_se(!valid_user_group_name("."));
- assert_se(!valid_user_group_name(".1"));
- assert_se(!valid_user_group_name(".65535"));
- assert_se(!valid_user_group_name(".-1"));
- assert_se(!valid_user_group_name(".-kkk"));
- assert_se(!valid_user_group_name(".rööt"));
- assert_se(!valid_user_group_name_or_id(".aaa:bbb"));
+ assert_se(!valid_user_group_name(NULL, 0));
+ assert_se(!valid_user_group_name("", 0));
+ assert_se(!valid_user_group_name("1", 0));
+ assert_se(!valid_user_group_name("65535", 0));
+ assert_se(!valid_user_group_name("-1", 0));
+ assert_se(!valid_user_group_name("-kkk", 0));
+ assert_se(!valid_user_group_name("rööt", 0));
+ assert_se(!valid_user_group_name(".", 0));
+ assert_se(!valid_user_group_name(".eff", 0));
+ assert_se(!valid_user_group_name("foo\nbar", 0));
+ assert_se(!valid_user_group_name("0123456789012345678901234567890123456789", 0));
+ assert_se(!valid_user_group_name("aaa:bbb", VALID_USER_ALLOW_NUMERIC));
+ assert_se(!valid_user_group_name(".", 0));
+ assert_se(!valid_user_group_name("..", 0));
+ assert_se(!valid_user_group_name("...", 0));
+ assert_se(!valid_user_group_name(".1", 0));
+ assert_se(!valid_user_group_name(".65535", 0));
+ assert_se(!valid_user_group_name(".-1", 0));
+ assert_se(!valid_user_group_name(".-kkk", 0));
+ assert_se(!valid_user_group_name(".rööt", 0));
+ assert_se(!valid_user_group_name(".aaa:bbb", VALID_USER_ALLOW_NUMERIC));
- assert_se(valid_user_group_name("root"));
- assert_se(valid_user_group_name("lennart"));
- assert_se(valid_user_group_name("LENNART"));
- assert_se(valid_user_group_name("_kkk"));
- assert_se(valid_user_group_name("kkk-"));
- assert_se(valid_user_group_name("kk-k"));
- assert_se(!valid_user_group_name("eff.eff"));
- assert_se(!valid_user_group_name("eff."));
+ assert_se(valid_user_group_name("root", 0));
+ assert_se(valid_user_group_name("lennart", 0));
+ assert_se(valid_user_group_name("LENNART", 0));
+ assert_se(valid_user_group_name("_kkk", 0));
+ assert_se(valid_user_group_name("kkk-", 0));
+ assert_se(valid_user_group_name("kk-k", 0));
+ assert_se(!valid_user_group_name("eff.eff", 0));
+ assert_se(!valid_user_group_name("eff.", 0));
- assert_se(valid_user_group_name("some5"));
- assert_se(!valid_user_group_name("5some"));
- assert_se(valid_user_group_name("INNER5NUMBER"));
+ assert_se(valid_user_group_name("some5", 0));
+ assert_se(!valid_user_group_name("5some", 0));
+ assert_se(valid_user_group_name("INNER5NUMBER", 0));
+
+ assert_se(!valid_user_group_name("piff.paff@ad.domain.example", 0));
+ assert_se(!valid_user_group_name("Dāvis", 0));
}
-static void test_valid_user_group_name_or_id_compat(void) {
+static void test_valid_user_group_name_or_numeric_relaxed(void) {
log_info("/* %s */", __func__);
- assert_se(!valid_user_group_name_or_id_compat(NULL));
- assert_se(!valid_user_group_name_or_id_compat(""));
- assert_se(valid_user_group_name_or_id_compat("0"));
- assert_se(valid_user_group_name_or_id_compat("1"));
- assert_se(valid_user_group_name_or_id_compat("65534"));
- assert_se(!valid_user_group_name_or_id_compat("65535"));
- assert_se(valid_user_group_name_or_id_compat("65536"));
- assert_se(!valid_user_group_name_or_id_compat("-1"));
- assert_se(!valid_user_group_name_or_id_compat("-kkk"));
- assert_se(!valid_user_group_name_or_id_compat("rööt"));
- assert_se(!valid_user_group_name_or_id_compat("."));
- assert_se(!valid_user_group_name_or_id_compat(".eff"));
- assert_se(valid_user_group_name_or_id_compat("eff.eff"));
- assert_se(valid_user_group_name_or_id_compat("eff."));
- assert_se(!valid_user_group_name_or_id_compat("foo\nbar"));
- assert_se(!valid_user_group_name_or_id_compat("0123456789012345678901234567890123456789"));
- assert_se(!valid_user_group_name_or_id_compat("aaa:bbb"));
+ assert_se(!valid_user_group_name(NULL, VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX));
+ assert_se(!valid_user_group_name("", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX));
+ assert_se(valid_user_group_name("0", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX));
+ assert_se(valid_user_group_name("1", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX));
+ assert_se(valid_user_group_name("65534", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX));
+ assert_se(!valid_user_group_name("65535", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX));
+ assert_se(valid_user_group_name("65536", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX));
+ assert_se(!valid_user_group_name("-1", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX));
+ assert_se(!valid_user_group_name("foo\nbar", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX));
+ assert_se(!valid_user_group_name("0123456789012345678901234567890123456789", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX));
+ assert_se(!valid_user_group_name("aaa:bbb", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX));
+ assert_se(!valid_user_group_name(".", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX));
+ assert_se(!valid_user_group_name("..", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX));
- assert_se(valid_user_group_name_or_id_compat("root"));
- assert_se(valid_user_group_name_or_id_compat("lennart"));
- assert_se(valid_user_group_name_or_id_compat("LENNART"));
- assert_se(valid_user_group_name_or_id_compat("_kkk"));
- assert_se(valid_user_group_name_or_id_compat("kkk-"));
- assert_se(valid_user_group_name_or_id_compat("kk-k"));
+ assert_se(valid_user_group_name("root", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX));
+ assert_se(valid_user_group_name("lennart", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX));
+ assert_se(valid_user_group_name("LENNART", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX));
+ assert_se(valid_user_group_name("_kkk", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX));
+ assert_se(valid_user_group_name("kkk-", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX));
+ assert_se(valid_user_group_name("kk-k", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX));
+ assert_se(valid_user_group_name("-kkk", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX));
+ assert_se(valid_user_group_name("rööt", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX));
+ assert_se(valid_user_group_name(".eff", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX));
+ assert_se(valid_user_group_name("eff.eff", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX));
+ assert_se(valid_user_group_name("eff.", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX));
+ assert_se(valid_user_group_name("...", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX));
- assert_se(valid_user_group_name_or_id_compat("some5"));
- assert_se(valid_user_group_name_or_id_compat("5some"));
- assert_se(valid_user_group_name_or_id_compat("INNER5NUMBER"));
+ assert_se(valid_user_group_name("some5", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX));
+ assert_se(valid_user_group_name("5some", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX));
+ assert_se(valid_user_group_name("INNER5NUMBER", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX));
+
+ assert_se(valid_user_group_name("piff.paff@ad.domain.example", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX));
+ assert_se(valid_user_group_name("Dāvis", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX));
}
-static void test_valid_user_group_name_or_id(void) {
+static void test_valid_user_group_name_or_numeric(void) {
log_info("/* %s */", __func__);
- assert_se(!valid_user_group_name_or_id(NULL));
- assert_se(!valid_user_group_name_or_id(""));
- assert_se(valid_user_group_name_or_id("0"));
- assert_se(valid_user_group_name_or_id("1"));
- assert_se(valid_user_group_name_or_id("65534"));
- assert_se(!valid_user_group_name_or_id("65535"));
- assert_se(valid_user_group_name_or_id("65536"));
- assert_se(!valid_user_group_name_or_id("-1"));
- assert_se(!valid_user_group_name_or_id("-kkk"));
- assert_se(!valid_user_group_name_or_id("rööt"));
- assert_se(!valid_user_group_name_or_id("."));
- assert_se(!valid_user_group_name_or_id(".eff"));
- assert_se(!valid_user_group_name_or_id("eff.eff"));
- assert_se(!valid_user_group_name_or_id("eff."));
- assert_se(!valid_user_group_name_or_id("foo\nbar"));
- assert_se(!valid_user_group_name_or_id("0123456789012345678901234567890123456789"));
- assert_se(!valid_user_group_name_or_id("aaa:bbb"));
+ assert_se(!valid_user_group_name(NULL, VALID_USER_ALLOW_NUMERIC));
+ assert_se(!valid_user_group_name("", VALID_USER_ALLOW_NUMERIC));
+ assert_se(valid_user_group_name("0", VALID_USER_ALLOW_NUMERIC));
+ assert_se(valid_user_group_name("1", VALID_USER_ALLOW_NUMERIC));
+ assert_se(valid_user_group_name("65534", VALID_USER_ALLOW_NUMERIC));
+ assert_se(!valid_user_group_name("65535", VALID_USER_ALLOW_NUMERIC));
+ assert_se(valid_user_group_name("65536", VALID_USER_ALLOW_NUMERIC));
+ assert_se(!valid_user_group_name("-1", VALID_USER_ALLOW_NUMERIC));
+ assert_se(!valid_user_group_name("-kkk", VALID_USER_ALLOW_NUMERIC));
+ assert_se(!valid_user_group_name("rööt", VALID_USER_ALLOW_NUMERIC));
+ assert_se(!valid_user_group_name(".", VALID_USER_ALLOW_NUMERIC));
+ assert_se(!valid_user_group_name("..", VALID_USER_ALLOW_NUMERIC));
+ assert_se(!valid_user_group_name("...", VALID_USER_ALLOW_NUMERIC));
+ assert_se(!valid_user_group_name(".eff", VALID_USER_ALLOW_NUMERIC));
+ assert_se(!valid_user_group_name("eff.eff", VALID_USER_ALLOW_NUMERIC));
+ assert_se(!valid_user_group_name("eff.", VALID_USER_ALLOW_NUMERIC));
+ assert_se(!valid_user_group_name("foo\nbar", VALID_USER_ALLOW_NUMERIC));
+ assert_se(!valid_user_group_name("0123456789012345678901234567890123456789", VALID_USER_ALLOW_NUMERIC));
+ assert_se(!valid_user_group_name("aaa:bbb", VALID_USER_ALLOW_NUMERIC));
- assert_se(valid_user_group_name_or_id("root"));
- assert_se(valid_user_group_name_or_id("lennart"));
- assert_se(valid_user_group_name_or_id("LENNART"));
- assert_se(valid_user_group_name_or_id("_kkk"));
- assert_se(valid_user_group_name_or_id("kkk-"));
- assert_se(valid_user_group_name_or_id("kk-k"));
+ assert_se(valid_user_group_name("root", VALID_USER_ALLOW_NUMERIC));
+ assert_se(valid_user_group_name("lennart", VALID_USER_ALLOW_NUMERIC));
+ assert_se(valid_user_group_name("LENNART", VALID_USER_ALLOW_NUMERIC));
+ assert_se(valid_user_group_name("_kkk", VALID_USER_ALLOW_NUMERIC));
+ assert_se(valid_user_group_name("kkk-", VALID_USER_ALLOW_NUMERIC));
+ assert_se(valid_user_group_name("kk-k", VALID_USER_ALLOW_NUMERIC));
- assert_se(valid_user_group_name_or_id("some5"));
- assert_se(!valid_user_group_name_or_id("5some"));
- assert_se(valid_user_group_name_or_id("INNER5NUMBER"));
+ assert_se(valid_user_group_name("some5", VALID_USER_ALLOW_NUMERIC));
+ assert_se(!valid_user_group_name("5some", VALID_USER_ALLOW_NUMERIC));
+ assert_se(valid_user_group_name("INNER5NUMBER", VALID_USER_ALLOW_NUMERIC));
+
+ assert_se(!valid_user_group_name("piff.paff@ad.domain.example", VALID_USER_ALLOW_NUMERIC));
+ assert_se(!valid_user_group_name("Dāvis", VALID_USER_ALLOW_NUMERIC));
}
static void test_valid_gecos(void) {
@@ -355,10 +374,10 @@ int main(int argc, char *argv[]) {
test_parse_uid();
test_uid_ptr();
- test_valid_user_group_name_compat();
+ test_valid_user_group_name_relaxed();
test_valid_user_group_name();
- test_valid_user_group_name_or_id_compat();
- test_valid_user_group_name_or_id();
+ test_valid_user_group_name_or_numeric_relaxed();
+ test_valid_user_group_name_or_numeric();
test_valid_gecos();
test_valid_home();
diff --git a/src/udev/net/link-config.c b/src/udev/net/link-config.c
index 0332e9926..cb564a7c5 100644
--- a/src/udev/net/link-config.c
+++ b/src/udev/net/link-config.c
@@ -490,7 +490,7 @@ int link_config_apply(link_config_ctx *ctx, link_config *config,
if (config->alternative_names_policy)
for (NamePolicy *p = config->alternative_names_policy; *p != _NAMEPOLICY_INVALID; p++) {
- const char *n;
+ const char *n = NULL;
switch (*p) {
case NAMEPOLICY_DATABASE:
diff --git a/src/userdb/userdbctl.c b/src/userdb/userdbctl.c
index b3ddd9d14..793ef6b07 100644
--- a/src/userdb/userdbctl.c
+++ b/src/userdb/userdbctl.c
@@ -541,16 +541,15 @@ static int ssh_authorized_keys(int argc, char *argv[], void *userdata) {
_cleanup_(user_record_unrefp) UserRecord *ur = NULL;
int r;
- if (!valid_user_group_name(argv[1]))
- return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid user name '%s'.", argv[1]);
-
r = userdb_by_name(argv[1], arg_userdb_flags, &ur);
if (r == -ESRCH)
- log_error_errno(r, "User %s does not exist.", argv[1]);
+ return log_error_errno(r, "User %s does not exist.", argv[1]);
else if (r == -EHOSTDOWN)
- log_error_errno(r, "Selected user database service is not available for this request.");
+ return log_error_errno(r, "Selected user database service is not available for this request.");
+ else if (r == -EINVAL)
+ return log_error_errno(r, "Failed to find user %s: %m (Invalid user name?)", argv[1]);
else if (r < 0)
- log_error_errno(r, "Failed to find user %s: %m", argv[1]);
+ return log_error_errno(r, "Failed to find user %s: %m", argv[1]);
if (strv_isempty(ur->ssh_authorized_keys))
log_debug("User record for %s has no public SSH keys.", argv[1]);
diff --git a/test/TEST-47-ISSUE-14566/testsuite.sh b/test/TEST-47-ISSUE-14566/testsuite.sh
index a0ba32530..df8d0e960 100755
--- a/test/TEST-47-ISSUE-14566/testsuite.sh
+++ b/test/TEST-47-ISSUE-14566/testsuite.sh
@@ -12,6 +12,7 @@ systemctl status issue_14566_test
leaked_pid=$(cat /leakedtestpid)
systemctl stop issue_14566_test
+sleep 1
# Leaked PID will still be around if we're buggy.
# I personally prefer to see 42.